2 * Routines for ISUP dissection
3 * Copyright 2001, Martina Obermeier <martina.obermeier@icn.siemens.de>
5 * Copyright 2004-2005, Anders Broman <anders.broman@ericsson.com>
6 * Modified 2003-09-10 by Anders Broman
7 * <anders.broman@ericsson.com>
8 * Inserted routines for BICC dissection according to Q.765.5 Q.1902 Q.1970 Q.1990,
9 * calling SDP dissector for RFC2327 decoding.
10 * Modified 2004-01-10 by Anders Broman to add abillity to dissect
11 * Content type application/ISUP RFC 3204 used in SIP-T
15 * Wireshark - Network traffic analyzer
16 * By Gerald Combs <gerald@wireshark.org>
17 * Copyright 1998 Gerald Combs
19 * Copied from README.developer
21 * This program is free software; you can redistribute it and/or
22 * modify it under the terms of the GNU General Public License
23 * as published by the Free Software Foundation; either version 2
24 * of the License, or (at your option) any later version.
26 * This program is distributed in the hope that it will be useful,
27 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 * GNU General Public License for more details.
31 * You should have received a copy of the GNU General Public License
32 * along with this program; if not, write to the Free Software
33 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
36 * http://www.itu.int/rec/recommendation.asp?type=products&lang=e&parent=T-REC-Q
37 * Q.763-199912, Q.763-200212Amd2
38 * ITU-T Q.763/Amd.1 (03/2001)
51 #include <epan/packet.h>
52 #include <epan/stats_tree.h>
53 #include <epan/asn1.h>
55 #include "packet-q931.h"
56 #include "packet-isup.h"
57 #include "packet-e164.h"
58 #include "packet-charging_ase.h"
59 #include <epan/sctpppids.h>
60 #include <epan/emem.h>
61 #include <epan/circuit.h>
62 #include <epan/reassemble.h>
63 #include <packet-mtp3.h>
65 static gint isup_standard = ITU_STANDARD;
67 #define MTP3_ISUP_SERVICE_INDICATOR 5
68 #define MTP3_BICC_SERVICE_INDICATOR 13
69 #define ASCII_NUMBER_DELTA 0x30
70 #define ASCII_LETTER_DELTA 0x37
72 /* Definition of protocol field values und lengths */
74 /* Definition of Message Types */
75 #define MESSAGE_TYPE_INITIAL_ADDR 1
76 #define MESSAGE_TYPE_SUBSEQ_ADDR 2
77 #define MESSAGE_TYPE_INFO_REQ 3
78 #define MESSAGE_TYPE_INFO 4
79 #define MESSAGE_TYPE_CONTINUITY 5
80 #define MESSAGE_TYPE_ADDR_CMPL 6
81 #define MESSAGE_TYPE_CONNECT 7
82 #define MESSAGE_TYPE_FORW_TRANS 8
83 #define MESSAGE_TYPE_ANSWER 9
84 #define MESSAGE_TYPE_RELEASE 12
85 #define MESSAGE_TYPE_SUSPEND 13
86 #define MESSAGE_TYPE_RESUME 14
87 #define MESSAGE_TYPE_REL_CMPL 16
88 #define MESSAGE_TYPE_CONT_CHECK_REQ 17
89 #define MESSAGE_TYPE_RESET_CIRCUIT 18
90 #define MESSAGE_TYPE_BLOCKING 19
91 #define MESSAGE_TYPE_UNBLOCKING 20
92 #define MESSAGE_TYPE_BLOCK_ACK 21
93 #define MESSAGE_TYPE_UNBLOCK_ACK 22
94 #define MESSAGE_TYPE_CIRC_GRP_RST 23
95 #define MESSAGE_TYPE_CIRC_GRP_BLCK 24
96 #define MESSAGE_TYPE_CIRC_GRP_UNBL 25
97 #define MESSAGE_TYPE_CIRC_GRP_BL_ACK 26
98 #define MESSAGE_TYPE_CIRC_GRP_UNBL_ACK 27
99 #define MESSAGE_TYPE_FACILITY_REQ 31
100 #define MESSAGE_TYPE_FACILITY_ACC 32
101 #define MESSAGE_TYPE_FACILITY_REJ 33
102 #define MESSAGE_TYPE_LOOP_BACK_ACK 36
103 #define MESSAGE_TYPE_PASS_ALONG 40
104 #define MESSAGE_TYPE_CIRC_GRP_RST_ACK 41
105 #define MESSAGE_TYPE_CIRC_GRP_QRY 42
106 #define MESSAGE_TYPE_CIRC_GRP_QRY_RSP 43
107 #define MESSAGE_TYPE_CALL_PROGRSS 44
108 #define MESSAGE_TYPE_USER2USER_INFO 45
109 #define MESSAGE_TYPE_UNEQUIPPED_CIC 46
110 #define MESSAGE_TYPE_CONFUSION 47
111 #define MESSAGE_TYPE_OVERLOAD 48
112 #define MESSAGE_TYPE_CHARGE_INFO 49
113 #define MESSAGE_TYPE_NETW_RESRC_MGMT 50
114 #define MESSAGE_TYPE_FACILITY 51
115 #define MESSAGE_TYPE_USER_PART_TEST 52
116 #define MESSAGE_TYPE_USER_PART_AVAIL 53
117 #define MESSAGE_TYPE_IDENT_REQ 54
118 #define MESSAGE_TYPE_IDENT_RSP 55
119 #define MESSAGE_TYPE_SEGMENTATION 56
120 #define MESSAGE_TYPE_LOOP_PREVENTION 64
121 #define MESSAGE_TYPE_APPLICATION_TRANS 65
122 #define MESSAGE_TYPE_PRE_RELEASE_INFO 66
123 #define MESSAGE_TYPE_SUBSEQUENT_DIR_NUM 67
125 #define ANSI_ISUP_MESSAGE_TYPE_CIRCUIT_RES_ACK 0xE9
126 #define ANSI_ISUP_MESSAGE_TYPE_CIRCUIT_RES 0xEA
127 #define ANSI_ISUP_MESSAGE_TYPE_CCT_VAL_TEST_RSP 0xEB
128 #define ANSI_ISUP_MESSAGE_TYPE_CCT_VAL_TEST 0xEC
129 #define ANSI_ISUP_MESSAGE_TYPE_EXIT 0xED
131 const value_string isup_message_type_value[] = {
132 { MESSAGE_TYPE_INITIAL_ADDR, "Initial address"},
133 { MESSAGE_TYPE_SUBSEQ_ADDR, "Subsequent address"},
134 { MESSAGE_TYPE_INFO_REQ, "Information request (national use)"},
135 { MESSAGE_TYPE_INFO, "Information (national use)"},
136 { MESSAGE_TYPE_CONTINUITY, "Continuity"},
137 { MESSAGE_TYPE_ADDR_CMPL, "Address complete"},
138 { MESSAGE_TYPE_CONNECT, "Connect"},
139 { MESSAGE_TYPE_FORW_TRANS, "Forward transfer"},
140 { MESSAGE_TYPE_ANSWER, "Answer"},
141 { MESSAGE_TYPE_RELEASE, "Release"},
142 { MESSAGE_TYPE_SUSPEND, "Suspend"},
143 { MESSAGE_TYPE_RESUME, "Resume"},
144 { MESSAGE_TYPE_REL_CMPL, "Release complete"},
145 { MESSAGE_TYPE_CONT_CHECK_REQ, "Continuity check request"},
146 { MESSAGE_TYPE_RESET_CIRCUIT, "Reset Circuit"},
147 { MESSAGE_TYPE_BLOCKING, "Blocking"},
148 { MESSAGE_TYPE_UNBLOCKING, "Unblocking"},
149 { MESSAGE_TYPE_BLOCK_ACK, "Blocking acknowledgement"},
150 { MESSAGE_TYPE_UNBLOCK_ACK, "Unblocking acknowledgment"},
151 { MESSAGE_TYPE_CIRC_GRP_RST, "Circuit group reset"},
152 { MESSAGE_TYPE_CIRC_GRP_BLCK, "Circuit group blocking"},
153 { MESSAGE_TYPE_CIRC_GRP_UNBL, "Circuit group unblocking"},
154 { MESSAGE_TYPE_CIRC_GRP_BL_ACK, "Circuit group blocking acknowledgement"},
155 { MESSAGE_TYPE_CIRC_GRP_UNBL_ACK, "Circuit group unblocking acknowledgement"},
156 { MESSAGE_TYPE_FACILITY_REQ, "Facility request"},
157 { MESSAGE_TYPE_FACILITY_ACC, "Facility accepted"},
158 { MESSAGE_TYPE_FACILITY_REJ, "Facility reject"},
159 { MESSAGE_TYPE_LOOP_BACK_ACK, "Loop back acknowledgement (national use)"},
160 { MESSAGE_TYPE_PASS_ALONG, "Pass-along (national use)"},
161 { MESSAGE_TYPE_CIRC_GRP_RST_ACK, "Circuit group reset acknowledgement"},
162 { MESSAGE_TYPE_CIRC_GRP_QRY, "Circuit group query (national use)"},
163 { MESSAGE_TYPE_CIRC_GRP_QRY_RSP, "Circuit group query response (national use)"},
164 { MESSAGE_TYPE_CALL_PROGRSS, "Call progress"},
165 { MESSAGE_TYPE_USER2USER_INFO, "User-to-user information"},
166 { MESSAGE_TYPE_UNEQUIPPED_CIC, "Unequipped CIC (national use)"},
167 { MESSAGE_TYPE_CONFUSION, "Confusion"},
168 { MESSAGE_TYPE_OVERLOAD, "Overload (national use)"},
169 { MESSAGE_TYPE_CHARGE_INFO, "Charge information (national use)"},
170 { MESSAGE_TYPE_NETW_RESRC_MGMT, "Network resource management"},
171 { MESSAGE_TYPE_FACILITY, "Facility"},
172 { MESSAGE_TYPE_USER_PART_TEST, "User part test"},
173 { MESSAGE_TYPE_USER_PART_AVAIL, "User part available"},
174 { MESSAGE_TYPE_IDENT_REQ, "Identification request"},
175 { MESSAGE_TYPE_IDENT_RSP, "Identification response"},
176 { MESSAGE_TYPE_SEGMENTATION, "Segmentation"},
177 { MESSAGE_TYPE_LOOP_PREVENTION, "Loop prevention"},
178 { MESSAGE_TYPE_APPLICATION_TRANS, "Application transport"},
179 { MESSAGE_TYPE_PRE_RELEASE_INFO, "Pre-release information"},
180 { MESSAGE_TYPE_SUBSEQUENT_DIR_NUM, "Subsequent Directory Number (national use)"},
183 static const value_string ansi_isup_message_type_value[] = {
184 { MESSAGE_TYPE_INITIAL_ADDR, "Initial address"},
185 { MESSAGE_TYPE_SUBSEQ_ADDR, "Subsequent address"},
186 { MESSAGE_TYPE_INFO_REQ, "Information request (national use)"},
187 { MESSAGE_TYPE_INFO, "Information (national use)"},
188 { MESSAGE_TYPE_CONTINUITY, "Continuity"},
189 { MESSAGE_TYPE_ADDR_CMPL, "Address complete"},
190 { MESSAGE_TYPE_CONNECT, "Connect"},
191 { MESSAGE_TYPE_FORW_TRANS, "Forward transfer"},
192 { MESSAGE_TYPE_ANSWER, "Answer"},
193 { MESSAGE_TYPE_RELEASE, "Release"},
194 { MESSAGE_TYPE_SUSPEND, "Suspend"},
195 { MESSAGE_TYPE_RESUME, "Resume"},
196 { MESSAGE_TYPE_REL_CMPL, "Release complete"},
197 { MESSAGE_TYPE_CONT_CHECK_REQ, "Continuity check request"},
198 { MESSAGE_TYPE_RESET_CIRCUIT, "Reset Circuit"},
199 { MESSAGE_TYPE_BLOCKING, "Blocking"},
200 { MESSAGE_TYPE_UNBLOCKING, "Unblocking"},
201 { MESSAGE_TYPE_BLOCK_ACK, "Blocking acknowledgement"},
202 { MESSAGE_TYPE_UNBLOCK_ACK, "Unblocking acknowledgment"},
203 { MESSAGE_TYPE_CIRC_GRP_RST, "Circuit group reset"},
204 { MESSAGE_TYPE_CIRC_GRP_BLCK, "Circuit group blocking"},
205 { MESSAGE_TYPE_CIRC_GRP_UNBL, "Circuit group unblocking"},
206 { MESSAGE_TYPE_CIRC_GRP_BL_ACK, "Circuit group blocking acknowledgement"},
207 { MESSAGE_TYPE_CIRC_GRP_UNBL_ACK, "Circuit group unblocking acknowledgement"},
208 { MESSAGE_TYPE_FACILITY_REQ, "Facility request"},
209 { MESSAGE_TYPE_FACILITY_ACC, "Facility accepted"},
210 { MESSAGE_TYPE_FACILITY_REJ, "Facility reject"},
211 { MESSAGE_TYPE_LOOP_BACK_ACK, "Loop back acknowledgement (national use)"},
212 { MESSAGE_TYPE_PASS_ALONG, "Pass-along (national use)"},
213 { MESSAGE_TYPE_CIRC_GRP_RST_ACK, "Circuit group reset acknowledgement"},
214 { MESSAGE_TYPE_CIRC_GRP_QRY, "Circuit group query (national use)"},
215 { MESSAGE_TYPE_CIRC_GRP_QRY_RSP, "Circuit group query response (national use)"},
216 { MESSAGE_TYPE_CALL_PROGRSS, "Call progress"},
217 { MESSAGE_TYPE_USER2USER_INFO, "User-to-user information"},
218 { MESSAGE_TYPE_UNEQUIPPED_CIC, "Unequipped CIC (national use)"},
219 { MESSAGE_TYPE_CONFUSION, "Confusion"},
220 { MESSAGE_TYPE_OVERLOAD, "Overload (national use)"},
221 { MESSAGE_TYPE_CHARGE_INFO, "Charge information (national use)"},
222 { MESSAGE_TYPE_NETW_RESRC_MGMT, "Network resource management"},
223 { MESSAGE_TYPE_FACILITY, "Facility"},
224 { MESSAGE_TYPE_USER_PART_TEST, "User part test"},
225 { MESSAGE_TYPE_USER_PART_AVAIL, "User part available"},
226 { MESSAGE_TYPE_IDENT_REQ, "Identification request"},
227 { MESSAGE_TYPE_IDENT_RSP, "Identification response"},
228 { MESSAGE_TYPE_SEGMENTATION, "Segmentation"},
229 { MESSAGE_TYPE_LOOP_PREVENTION, "Loop prevention"},
230 { MESSAGE_TYPE_APPLICATION_TRANS, "Application transport"},
231 { MESSAGE_TYPE_PRE_RELEASE_INFO, "Pre-release information"},
232 { MESSAGE_TYPE_SUBSEQUENT_DIR_NUM, "Subsequent Directory Number (national use)"},
233 { ANSI_ISUP_MESSAGE_TYPE_CIRCUIT_RES_ACK, "Circuit Reservation Acknowledge"},
234 { ANSI_ISUP_MESSAGE_TYPE_CIRCUIT_RES, "Circuit Reservation"},
235 { ANSI_ISUP_MESSAGE_TYPE_CCT_VAL_TEST_RSP, "Circuit Validation Test Response"},
236 { ANSI_ISUP_MESSAGE_TYPE_CCT_VAL_TEST, "Circuit Validation Test"},
237 { ANSI_ISUP_MESSAGE_TYPE_EXIT, "Exit"},
239 /* Same as above but in acronym form (for the Info column) */
240 const value_string isup_message_type_value_acro[] = {
241 { MESSAGE_TYPE_INITIAL_ADDR, "IAM"},
242 { MESSAGE_TYPE_SUBSEQ_ADDR, "SAM"},
243 { MESSAGE_TYPE_INFO_REQ, "INR"},
244 { MESSAGE_TYPE_INFO, "INF"},
245 { MESSAGE_TYPE_CONTINUITY, "COT"},
246 { MESSAGE_TYPE_ADDR_CMPL, "ACM"},
247 { MESSAGE_TYPE_CONNECT, "CON"},
248 { MESSAGE_TYPE_FORW_TRANS, "FOT"},
249 { MESSAGE_TYPE_ANSWER, "ANM"},
250 { MESSAGE_TYPE_RELEASE, "REL"},
251 { MESSAGE_TYPE_SUSPEND, "SUS"},
252 { MESSAGE_TYPE_RESUME, "RES"},
253 { MESSAGE_TYPE_REL_CMPL, "RLC"},
254 { MESSAGE_TYPE_CONT_CHECK_REQ, "CCR"},
255 { MESSAGE_TYPE_RESET_CIRCUIT, "RSC"},
256 { MESSAGE_TYPE_BLOCKING, "BLO"},
257 { MESSAGE_TYPE_UNBLOCKING, "UBL"},
258 { MESSAGE_TYPE_BLOCK_ACK, "BLA"},
259 { MESSAGE_TYPE_UNBLOCK_ACK, "UBLA"},
260 { MESSAGE_TYPE_CIRC_GRP_RST, "GRS"},
261 { MESSAGE_TYPE_CIRC_GRP_BLCK, "CGB"},
262 { MESSAGE_TYPE_CIRC_GRP_UNBL, "CGU"},
263 { MESSAGE_TYPE_CIRC_GRP_BL_ACK, "CGBA"},
264 { MESSAGE_TYPE_CIRC_GRP_UNBL_ACK, "CGUA"},
265 { MESSAGE_TYPE_FACILITY_REQ, "FAR"},
266 { MESSAGE_TYPE_FACILITY_ACC, "FAA"},
267 { MESSAGE_TYPE_FACILITY_REJ, "FRJ"},
268 { MESSAGE_TYPE_LOOP_BACK_ACK, "LPA"},
269 { MESSAGE_TYPE_PASS_ALONG, "PAM"},
270 { MESSAGE_TYPE_CIRC_GRP_RST_ACK, "GRA"},
271 { MESSAGE_TYPE_CIRC_GRP_QRY, "CQM"},
272 { MESSAGE_TYPE_CIRC_GRP_QRY_RSP, "CQR"},
273 { MESSAGE_TYPE_CALL_PROGRSS, "CPG"},
274 { MESSAGE_TYPE_USER2USER_INFO, "UUI"},
275 { MESSAGE_TYPE_UNEQUIPPED_CIC, "UCIC"},
276 { MESSAGE_TYPE_CONFUSION, "CFN"},
277 { MESSAGE_TYPE_OVERLOAD, "OLM"},
278 { MESSAGE_TYPE_CHARGE_INFO, "CRG"},
279 { MESSAGE_TYPE_NETW_RESRC_MGMT, "NRM"},
280 { MESSAGE_TYPE_FACILITY, "FAC"},
281 { MESSAGE_TYPE_USER_PART_TEST, "UPT"},
282 { MESSAGE_TYPE_USER_PART_AVAIL, "UPA"},
283 { MESSAGE_TYPE_IDENT_REQ, "IDR"},
284 { MESSAGE_TYPE_IDENT_RSP, "IDS"},
285 { MESSAGE_TYPE_SEGMENTATION, "SGM"},
286 { MESSAGE_TYPE_LOOP_PREVENTION, "LOP"},
287 { MESSAGE_TYPE_APPLICATION_TRANS, "APM"},
288 { MESSAGE_TYPE_PRE_RELEASE_INFO, "PRI"},
289 { MESSAGE_TYPE_SUBSEQUENT_DIR_NUM, "SDN"},
292 /* Same as above but in acronym form (for the Info column) */
293 static const value_string ansi_isup_message_type_value_acro[] = {
294 { MESSAGE_TYPE_INITIAL_ADDR, "IAM"},
295 { MESSAGE_TYPE_SUBSEQ_ADDR, "SAM"},
296 { MESSAGE_TYPE_INFO_REQ, "INR"},
297 { MESSAGE_TYPE_INFO, "INF"},
298 { MESSAGE_TYPE_CONTINUITY, "COT"},
299 { MESSAGE_TYPE_ADDR_CMPL, "ACM"},
300 { MESSAGE_TYPE_CONNECT, "CON"},
301 { MESSAGE_TYPE_FORW_TRANS, "FOT"},
302 { MESSAGE_TYPE_ANSWER, "ANM"},
303 { MESSAGE_TYPE_RELEASE, "REL"},
304 { MESSAGE_TYPE_SUSPEND, "SUS"},
305 { MESSAGE_TYPE_RESUME, "RES"},
306 { MESSAGE_TYPE_REL_CMPL, "RLC"},
307 { MESSAGE_TYPE_CONT_CHECK_REQ, "CCR"},
308 { MESSAGE_TYPE_RESET_CIRCUIT, "RSC"},
309 { MESSAGE_TYPE_BLOCKING, "BLO"},
310 { MESSAGE_TYPE_UNBLOCKING, "UBL"},
311 { MESSAGE_TYPE_BLOCK_ACK, "BLA"},
312 { MESSAGE_TYPE_UNBLOCK_ACK, "UBLA"},
313 { MESSAGE_TYPE_CIRC_GRP_RST, "GRS"},
314 { MESSAGE_TYPE_CIRC_GRP_BLCK, "CGB"},
315 { MESSAGE_TYPE_CIRC_GRP_UNBL, "CGU"},
316 { MESSAGE_TYPE_CIRC_GRP_BL_ACK, "CGBA"},
317 { MESSAGE_TYPE_CIRC_GRP_UNBL_ACK, "CGUA"},
318 { MESSAGE_TYPE_FACILITY_REQ, "FAR"},
319 { MESSAGE_TYPE_FACILITY_ACC, "FAA"},
320 { MESSAGE_TYPE_FACILITY_REJ, "FRJ"},
321 { MESSAGE_TYPE_LOOP_BACK_ACK, "LPA"},
322 { MESSAGE_TYPE_PASS_ALONG, "PAM"},
323 { MESSAGE_TYPE_CIRC_GRP_RST_ACK, "GRA"},
324 { MESSAGE_TYPE_CIRC_GRP_QRY, "CQM"},
325 { MESSAGE_TYPE_CIRC_GRP_QRY_RSP, "CQR"},
326 { MESSAGE_TYPE_CALL_PROGRSS, "CPG"},
327 { MESSAGE_TYPE_USER2USER_INFO, "UUI"},
328 { MESSAGE_TYPE_UNEQUIPPED_CIC, "UCIC"},
329 { MESSAGE_TYPE_CONFUSION, "CFN"},
330 { MESSAGE_TYPE_OVERLOAD, "OLM"},
331 { MESSAGE_TYPE_CHARGE_INFO, "CRG"},
332 { MESSAGE_TYPE_NETW_RESRC_MGMT, "NRM"},
333 { MESSAGE_TYPE_FACILITY, "FAC"},
334 { MESSAGE_TYPE_USER_PART_TEST, "UPT"},
335 { MESSAGE_TYPE_USER_PART_AVAIL, "UPA"},
336 { MESSAGE_TYPE_IDENT_REQ, "IDR"},
337 { MESSAGE_TYPE_IDENT_RSP, "IDS"},
338 { MESSAGE_TYPE_SEGMENTATION, "SGM"},
339 { MESSAGE_TYPE_LOOP_PREVENTION, "LOP"},
340 { MESSAGE_TYPE_APPLICATION_TRANS, "APM"},
341 { MESSAGE_TYPE_PRE_RELEASE_INFO, "PRI"},
342 { MESSAGE_TYPE_SUBSEQUENT_DIR_NUM, "SDN"},
343 { ANSI_ISUP_MESSAGE_TYPE_CIRCUIT_RES_ACK, "CRA"},
344 { ANSI_ISUP_MESSAGE_TYPE_CIRCUIT_RES, "CRM"},
345 { ANSI_ISUP_MESSAGE_TYPE_CCT_VAL_TEST_RSP, "CVR"},
346 { ANSI_ISUP_MESSAGE_TYPE_CCT_VAL_TEST, "CVT"},
347 { ANSI_ISUP_MESSAGE_TYPE_EXIT, "EXIT"},
350 const value_string isup_parameter_type_value[] = {
351 { PARAM_TYPE_END_OF_OPT_PARAMS, "End of optional parameters"},
352 { PARAM_TYPE_CALL_REF, "Call Reference (national use)"},
353 { PARAM_TYPE_TRANSM_MEDIUM_REQU, "Transmission medium requirement"},
354 { PARAM_TYPE_ACC_TRANSP, "Access transport"},
355 { PARAM_TYPE_CALLED_PARTY_NR, "Called party number"},
356 { PARAM_TYPE_SUBSQT_NR, "Subsequent number"},
357 { PARAM_TYPE_NATURE_OF_CONN_IND, "Nature of connection indicators"},
358 { PARAM_TYPE_FORW_CALL_IND, "Forward call indicators"},
359 { PARAM_TYPE_OPT_FORW_CALL_IND, "Optional forward call indicators"},
360 { PARAM_TYPE_CALLING_PRTY_CATEG, "Calling party's category"},
361 { PARAM_TYPE_CALLING_PARTY_NR, "Calling party number"},
362 { PARAM_TYPE_REDIRECTING_NR, "Redirecting number"},
363 { PARAM_TYPE_REDIRECTION_NR, "Redirection number"},
364 { PARAM_TYPE_CONNECTION_REQ, "Connection request"},
365 { PARAM_TYPE_INFO_REQ_IND, "Information request indicators (national use)"},
366 { PARAM_TYPE_INFO_IND, "Information indicators (national use)"},
367 { PARAM_TYPE_CONTINUITY_IND, "Continuity request"},
368 { PARAM_TYPE_BACKW_CALL_IND, "Backward call indicators"},
369 { PARAM_TYPE_CAUSE_INDICATORS, "Cause indicators"},
370 { PARAM_TYPE_REDIRECTION_INFO, "Redirection information"},
371 { PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE, "Circuit group supervision message type"},
372 { PARAM_TYPE_RANGE_AND_STATUS, "Range and Status"},
373 { PARAM_TYPE_FACILITY_IND, "Facility indicator"},
374 { PARAM_TYPE_CLSD_USR_GRP_ILOCK_CD, "Closed user group interlock code"},
375 { PARAM_TYPE_USER_SERVICE_INFO, "User service information"},
376 { PARAM_TYPE_SIGNALLING_POINT_CODE, "Signalling point code (national use)"},
377 { PARAM_TYPE_USER_TO_USER_INFO, "User-to-user information"},
378 { PARAM_TYPE_CONNECTED_NR, "Connected number"},
379 { PARAM_TYPE_SUSP_RESUME_IND, "Suspend/Resume indicators"},
380 { PARAM_TYPE_TRANSIT_NETW_SELECT, "Transit network selection (national use)"},
381 { PARAM_TYPE_EVENT_INFO, "Event information"},
382 { PARAM_TYPE_CIRC_ASSIGN_MAP, "Circuit assignment map"},
383 { PARAM_TYPE_CIRC_STATE_IND, "Circuit state indicator (national use)"},
384 { PARAM_TYPE_AUTO_CONG_LEVEL, "Automatic congestion level"},
385 { PARAM_TYPE_ORIG_CALLED_NR, "Original called number"},
386 { PARAM_TYPE_OPT_BACKW_CALL_IND, "Backward call indicators"},
387 { PARAM_TYPE_USER_TO_USER_IND, "User-to-user indicators"},
388 { PARAM_TYPE_ORIG_ISC_POINT_CODE, "Origination ISC point code"},
389 { PARAM_TYPE_GENERIC_NOTIF_IND, "Generic notification indicator"},
390 { PARAM_TYPE_CALL_HIST_INFO, "Call history information"},
391 { PARAM_TYPE_ACC_DELIV_INFO, "Access delivery information"},
392 { PARAM_TYPE_NETW_SPECIFIC_FACLTY, "Network specific facility (national use)"},
393 { PARAM_TYPE_USER_SERVICE_INFO_PR, "User service information prime"},
394 { PARAM_TYPE_PROPAG_DELAY_COUNTER, "Propagation delay counter"},
395 { PARAM_TYPE_REMOTE_OPERATIONS, "Remote operations (national use)"},
396 { PARAM_TYPE_SERVICE_ACTIVATION, "Service activation"},
397 { PARAM_TYPE_USER_TELESERV_INFO, "User teleservice information"},
398 { PARAM_TYPE_TRANSM_MEDIUM_USED, "Transmission medium used"},
399 { PARAM_TYPE_CALL_DIV_INFO, "Call diversion information"},
400 { PARAM_TYPE_ECHO_CTRL_INFO, "Echo control information"},
401 { PARAM_TYPE_MSG_COMPAT_INFO, "Message compatibility information"},
402 { PARAM_TYPE_PARAM_COMPAT_INFO, "Parameter compatibility information"},
403 { PARAM_TYPE_MLPP_PRECEDENCE, "MLPP precedence"},
404 { PARAM_TYPE_MCID_REQ_IND, "MCID request indicators"},
405 { PARAM_TYPE_MCID_RSP_IND, "MCID response indicators"},
406 { PARAM_TYPE_HOP_COUNTER, "Hop counter"},
407 { PARAM_TYPE_TRANSM_MEDIUM_RQUR_PR, "Transmission medium requirement prime"},
408 { PARAM_TYPE_LOCATION_NR, "Location number"},
409 { PARAM_TYPE_REDIR_NR_RSTRCT, "Redirection number restriction"},
410 { PARAM_TYPE_CALL_TRANS_REF, "Call transfer reference"},
411 { PARAM_TYPE_LOOP_PREV_IND, "Loop prevention indicators"},
412 { PARAM_TYPE_CALL_TRANS_NR, "Call transfer number"},
413 { PARAM_TYPE_CCSS, "CCSS"},
414 { PARAM_TYPE_FORW_GVNS, "Forward GVNS"},
415 { PARAM_TYPE_BACKW_GVNS, "Backward GVNS"},
416 { PARAM_TYPE_REDIRECT_CAPAB, "Redirect capability (reserved for national use)"},
417 { PARAM_TYPE_NETW_MGMT_CTRL, "Network management controls"},
418 { PARAM_TYPE_CORRELATION_ID, "Correlation id"},
419 { PARAM_TYPE_SCF_ID, "SCF id"},
420 { PARAM_TYPE_CALL_DIV_TREAT_IND, "Call diversion treatment indicators"},
421 { PARAM_TYPE_CALLED_IN_NR, "Called IN number"},
422 { PARAM_TYPE_CALL_OFF_TREAT_IND, "Call offering treatment indicators"},
423 { PARAM_TYPE_CHARGED_PARTY_IDENT, "Charged party identification (national use)"},
424 { PARAM_TYPE_CONF_TREAT_IND, "Conference treatment indicators"},
425 { PARAM_TYPE_DISPLAY_INFO, "Display information"},
426 { PARAM_TYPE_UID_ACTION_IND, "UID action indicators"},
427 { PARAM_TYPE_UID_CAPAB_IND, "UID capability indicators"},
428 { PARAM_TYPE_REDIRECT_COUNTER, "Redirect counter (reserved for national use)"},
429 { PARAM_TYPE_COLLECT_CALL_REQ, "Collect call request"},
430 { PARAM_TYPE_GENERIC_NR, "Generic number"},
431 { PARAM_TYPE_GENERIC_DIGITS, "Generic digits (national use)"},
432 { PARAM_TYPE_APPLICATON_TRANS, "Application transport"},
435 static const value_string ansi_isup_parameter_type_value[] = {
436 { PARAM_TYPE_END_OF_OPT_PARAMS, "End of optional parameters"},
437 { PARAM_TYPE_CALL_REF, "Call Reference (national use)"},
438 { PARAM_TYPE_TRANSM_MEDIUM_REQU, "Transmission medium requirement"},
439 { PARAM_TYPE_ACC_TRANSP, "Access transport"},
440 { PARAM_TYPE_CALLED_PARTY_NR, "Called party number"},
441 { PARAM_TYPE_SUBSQT_NR, "Subsequent number"},
442 { PARAM_TYPE_NATURE_OF_CONN_IND, "Nature of connection indicators"},
443 { PARAM_TYPE_FORW_CALL_IND, "Forward call indicators"},
444 { PARAM_TYPE_OPT_FORW_CALL_IND, "Optional forward call indicators"},
445 { PARAM_TYPE_CALLING_PRTY_CATEG, "Calling party's category"},
446 { PARAM_TYPE_CALLING_PARTY_NR, "Calling party number"},
447 { PARAM_TYPE_REDIRECTING_NR, "Redirecting number"},
448 { PARAM_TYPE_REDIRECTION_NR, "Redirection number"},
449 { PARAM_TYPE_CONNECTION_REQ, "Connection request"},
450 { PARAM_TYPE_INFO_REQ_IND, "Information request indicators (national use)"},
451 { PARAM_TYPE_INFO_IND, "Information indicators (national use)"},
452 { PARAM_TYPE_CONTINUITY_IND, "Continuity request"},
453 { PARAM_TYPE_BACKW_CALL_IND, "Backward call indicators"},
454 { PARAM_TYPE_CAUSE_INDICATORS, "Cause indicators"},
455 { PARAM_TYPE_REDIRECTION_INFO, "Redirection information"},
456 { PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE, "Circuit group supervision message type"},
457 { PARAM_TYPE_RANGE_AND_STATUS, "Range and Status"},
458 { PARAM_TYPE_FACILITY_IND, "Facility indicator"},
459 { PARAM_TYPE_CLSD_USR_GRP_ILOCK_CD, "Closed user group interlock code"},
460 { PARAM_TYPE_USER_SERVICE_INFO, "User service information"},
461 { PARAM_TYPE_SIGNALLING_POINT_CODE, "Signalling point code (national use)"},
462 { PARAM_TYPE_USER_TO_USER_INFO, "User-to-user information"},
463 { PARAM_TYPE_CONNECTED_NR, "Connected number"},
464 { PARAM_TYPE_SUSP_RESUME_IND, "Suspend/Resume indicators"},
465 { PARAM_TYPE_TRANSIT_NETW_SELECT, "Transit network selection (national use)"},
466 { PARAM_TYPE_EVENT_INFO, "Event information"},
467 { PARAM_TYPE_CIRC_ASSIGN_MAP, "Circuit assignment map"},
468 { PARAM_TYPE_CIRC_STATE_IND, "Circuit state indicator (national use)"},
469 { PARAM_TYPE_AUTO_CONG_LEVEL, "Automatic congestion level"},
470 { PARAM_TYPE_ORIG_CALLED_NR, "Original called number"},
471 { PARAM_TYPE_OPT_BACKW_CALL_IND, "Backward call indicators"},
472 { PARAM_TYPE_USER_TO_USER_IND, "User-to-user indicators"},
473 { PARAM_TYPE_ORIG_ISC_POINT_CODE, "Origination ISC point code"},
474 { PARAM_TYPE_GENERIC_NOTIF_IND, "Generic notification indicator"},
475 { PARAM_TYPE_CALL_HIST_INFO, "Call history information"},
476 { PARAM_TYPE_ACC_DELIV_INFO, "Access delivery information"},
477 { PARAM_TYPE_NETW_SPECIFIC_FACLTY, "Network specific facility (national use)"},
478 { PARAM_TYPE_USER_SERVICE_INFO_PR, "User service information prime"},
479 { PARAM_TYPE_PROPAG_DELAY_COUNTER, "Propagation delay counter"},
480 { PARAM_TYPE_REMOTE_OPERATIONS, "Remote operations (national use)"},
481 { PARAM_TYPE_SERVICE_ACTIVATION, "Service activation"},
482 { PARAM_TYPE_USER_TELESERV_INFO, "User teleservice information"},
483 { PARAM_TYPE_TRANSM_MEDIUM_USED, "Transmission medium used"},
484 { PARAM_TYPE_CALL_DIV_INFO, "Call diversion information"},
485 { PARAM_TYPE_ECHO_CTRL_INFO, "Echo control information"},
486 { PARAM_TYPE_MSG_COMPAT_INFO, "Message compatibility information"},
487 { PARAM_TYPE_PARAM_COMPAT_INFO, "Parameter compatibility information"},
488 { PARAM_TYPE_MLPP_PRECEDENCE, "MLPP precedence"},
489 { PARAM_TYPE_MCID_REQ_IND, "MCID request indicators"},
490 { PARAM_TYPE_MCID_RSP_IND, "MCID response indicators"},
491 { PARAM_TYPE_HOP_COUNTER, "Hop counter"},
492 { PARAM_TYPE_ORIG_LINE_INFO, "Originating line info"},
493 { PARAM_TYPE_TRANSM_MEDIUM_RQUR_PR, "Transmission medium requirement prime"},
494 { PARAM_TYPE_LOCATION_NR, "Location number"},
495 { PARAM_TYPE_REDIR_NR_RSTRCT, "Redirection number restriction"},
496 { PARAM_TYPE_CALL_TRANS_REF, "Call transfer reference"},
497 { PARAM_TYPE_LOOP_PREV_IND, "Loop prevention indicators"},
498 { PARAM_TYPE_CALL_TRANS_NR, "Call transfer number"},
499 { PARAM_TYPE_CCSS, "CCSS"},
500 { PARAM_TYPE_FORW_GVNS, "Forward GVNS"},
501 { PARAM_TYPE_BACKW_GVNS, "Backward GVNS"},
502 { PARAM_TYPE_REDIRECT_CAPAB, "Redirect capability (reserved for national use)"},
503 { PARAM_TYPE_NETW_MGMT_CTRL, "Network management controls"},
504 { PARAM_TYPE_CORRELATION_ID, "Correlation id"},
505 { PARAM_TYPE_SCF_ID, "SCF id"},
506 { PARAM_TYPE_CALL_DIV_TREAT_IND, "Call diversion treatment indicators"},
507 { PARAM_TYPE_CALLED_IN_NR, "Called IN number"},
508 { PARAM_TYPE_CALL_OFF_TREAT_IND, "Call offering treatment indicators"},
509 { PARAM_TYPE_CHARGED_PARTY_IDENT, "Charged party identification (national use)"},
510 { PARAM_TYPE_CONF_TREAT_IND, "Conference treatment indicators"},
511 { PARAM_TYPE_DISPLAY_INFO, "Display information"},
512 { PARAM_TYPE_UID_ACTION_IND, "UID action indicators"},
513 { PARAM_TYPE_UID_CAPAB_IND, "UID capability indicators"},
514 { PARAM_TYPE_REDIRECT_COUNTER, "Redirect counter (reserved for national use)"},
515 { PARAM_TYPE_COLLECT_CALL_REQ, "Collect call request"},
516 { PARAM_TYPE_CALLING_GEODETIC_LOCATION, "Calling geodetic location"},
517 { PARAM_TYPE_GENERIC_NR, "Generic number"},
518 { PARAM_TYPE_JURISDICTION, "Jurisdiction"},
519 { PARAM_TYPE_GENERIC_NAME, "Generic name"},
520 { PARAM_TYPE_GENERIC_DIGITS, "Generic digits (national use)"},
521 { PARAM_TYPE_APPLICATON_TRANS, "Application transport"},
522 { ANSI_ISUP_PARAM_TYPE_OPER_SERV_INF, "Operator Services information"},
523 { ANSI_ISUP_PARAM_TYPE_EGRESS, "Egress"},
524 { ANSI_ISUP_PARAM_TYPE_JURISDICTION, "Jurisdiction"},
525 { ANSI_ISUP_PARAM_TYPE_CARRIER_ID, "Carrier identification"},
526 { ANSI_ISUP_PARAM_TYPE_BUSINESS_GRP, "Business group"},
527 { ANSI_ISUP_PARAM_TYPE_GENERIC_NAME, "Generic name"},
528 { ANSI_ISUP_PARAM_TYPE_NOTIF_IND, "Notification indicator"},
529 { ANSI_ISUP_PARAM_TYPE_CG_CHAR_IND, "Circuit group characteristic indicator"},
530 { ANSI_ISUP_PARAM_TYPE_CVR_RESP_IND, "Circuit validation response indicator"},
531 { ANSI_ISUP_PARAM_TYPE_OUT_TRK_GRP_NM,"Outgoing trunk group number"},
532 { ANSI_ISUP_PARAM_TYPE_CI_NAME_IND, "Circuit identification name"},
533 { ANSI_ISUP_PARAM_CLLI_CODE, "COMMON LANGUAGE location identification (CLLI) code"},
534 { ANSI_ISUP_PARAM_ORIG_LINE_INF, "Originating line information"},
535 { ANSI_ISUP_PARAM_CHRG_NO, "Charge number"},
536 { ANSI_ISUP_PARAM_SERV_CODE_IND, "Service code indicator"},
537 { ANSI_ISUP_PARAM_SPEC_PROC_REQ, "Special processing request"},
538 { ANSI_ISUP_PARAM_CARRIER_SEL_INF, "Carrier selection information"},
539 { ANSI_ISUP_PARAM_NET_TRANS, "Network transport"},
543 #define BICC_CIC_LENGTH 4
544 #define MESSAGE_TYPE_LENGTH 1
545 #define COMMON_HEADER_LENGTH (CIC_LENGTH + MESSAGE_TYPE_LENGTH)
546 #define BICC_COMMON_HEADER_LENGTH (BICC_CIC_LENGTH + MESSAGE_TYPE_LENGTH)
548 #define MAXDIGITS 32 /* Max number of address digits */
549 #define MAXGNAME 15 /* Max number of characters in generic name */
551 #define PARAMETER_TYPE_LENGTH 1
552 #define PARAMETER_POINTER_LENGTH 1
553 #define PARAMETER_LENGTH_IND_LENGTH 1
555 /* All following parameter length definitions are WITHOUT the parameter type byte and length indicator for optional parameters*/
556 #define PARAMETER_NAME_LENGTH 1
557 #define PARAMETER_LENGTH_IND_LENGTH 1
558 #define ACCESS_DELIVERY_INFO_LENGTH 1
559 #define AUTO_CONGEST_LEVEL_LENGTH 1
560 #define BACKWARD_CALL_IND_LENGTH 2
561 #define BACKWARD_GVNS_LENGTH 1
562 #define CALL_DIV_INFO_LENGTH 1
563 #define CALL_DIV_TREATMENT_IND_LENGTH 1
564 #define CALL_HISTORY_INFO_LENGTH 2
565 #define CALL_OFFERING_TREATMENT_IND_LENGTH 1
566 #define CALL_REFERENCE_LENGTH 5
567 #define CALL_TRANSFER_REF_LENGTH 1
568 #define CALLING_PRTYS_CATEGORY_LENGTH 1
569 #define CCSS_LENGTH 1
570 #define CIRCUIT_ASSIGNMENT_MAP_LENGTH 5
571 #define CIRC_GRP_SV_MSG_TYPE_LENGTH 1
572 #define CLOSED_USR_GRP_INTERLOCK_CODE_LENGTH 4
573 #define COLLECT_CALL_REQUEST_LENGTH 1
574 #define CONFERENCE_TREATMENT_IND_LENGTH 1
575 #define CONNECTION_REQUEST_LENGTH 7
576 #define CONTINUITY_IND_LENGTH 1
577 #define ECHO_CONTROL_INFO_LENGTH 1
578 #define END_OF_OPT_PART_LENGTH 1
579 #define EVENT_INFO_LENGTH 1
580 #define FACILITY_IND_LENGTH 1
581 #define FORWARD_CALL_IND_LENGTH 2
582 #define GENERIC_NOTIFICATION_IND_LENGTH 1
583 #define HOP_COUNTER_LENGTH 1
584 #define ORIG_LINE_INFO_LENGTH 1
585 #define INFO_IND_LENGTH 2
586 #define INFO_REQUEST_IND_LENGTH 2
587 #define LOOP_PREVENTION_IND_LENGTH 1
588 #define MCID_REQUEST_IND_LENGTH 1
589 #define MCID_RESPONSE_IND_LENGTH 1
590 #define MLPP_PRECEDENCE_LENGTH 1
591 #define NATURE_OF_CONNECTION_IND_LENGTH 1
592 #define NETWORK_MANAGEMENT_CONTROLS_LENGTH 1
593 #define OPTIONAL_BACKWARD_CALL_IND_LENGTH 1
594 #define OPTIONAL_FORWARD_CALL_IND_LENGTH 1
595 #define ORIGINAL_ISC_POINT_CODE_LENGTH 2
596 #define PROPAGATION_DELAY_COUNT_LENGTH 2
597 #define REDIRECTION_NUMBER_LENGTH 2
598 #define REDIRECTION_INFO_LENGTH 2
599 #define REDIRECTION_NUMBER_RESTRICTION_LENGTH 1
600 #define SIGNALLING_POINT_CODE_LENGTH 2
601 #define SUSPEND_RESUME_IND_LENGTH 1
602 #define TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH 1
603 #define TRANSMISSION_MEDIUM_RQMT_PRIME_LENGTH 1
604 #define TRANSMISSION_MEDIUM_USED_LENGTH 1
605 #define UID_ACTION_IND_LENGTH 1
606 #define UID_CAPABILITY_IND_LENGTH 1
607 #define USER_TELESERVICE_INFO_LENGTH 2
608 #define USER_TO_USER_IND_LENGTH 1
609 #define RANGE_LENGTH 1
611 #define CVR_RESP_IND_LENGTH 1
612 #define CG_CHAR_IND_LENGTH 1
613 #define CI_NAME_IND 28
614 #define CLLI_CODE_LENGTH 13
616 #define CALL_ID_LENGTH 3 /* for parameter Call Reference */
617 #define SPC_LENGTH 2 /* for parameter Call Reference, Connection request */
618 #define LOCAL_REF_LENGTH 3 /* for parameter Connection request */
619 #define PROTOCOL_CLASS_LENGTH 1 /* for parameter Connection request */
620 #define CREDIT_LENGTH 1 /* for parameter Connection request */
623 #define BICC_CIC_OFFSET 0
625 #define NO_SATELLITE_CIRCUIT_IN_CONNECTION 0
626 #define ONE_SATELLITE_CIRCUIT_IN_CONNECTION 1
627 #define TWO_SATELLITE_CIRCUIT_IN_CONNECTION 2
628 static const value_string isup_satellite_ind_value[] = {
629 { NO_SATELLITE_CIRCUIT_IN_CONNECTION, "No Satellite circuit in connection"},
630 { ONE_SATELLITE_CIRCUIT_IN_CONNECTION, "One Satellite circuit in connection"},
631 { TWO_SATELLITE_CIRCUIT_IN_CONNECTION, "Two Satellite circuits in connection"},
634 #define CONTINUITY_CHECK_NOT_REQUIRED 0
635 #define CONTINUITY_CHECK_REQUIRED 1
636 #define CONTINUITY_CHECK_ON_A_PREVIOUS_CIRCUIT 2
637 static const value_string isup_continuity_check_ind_value[] = {
638 { CONTINUITY_CHECK_NOT_REQUIRED, "Continuity check not required"},
639 { CONTINUITY_CHECK_REQUIRED, "Continuity check required on this circuit"},
640 { CONTINUITY_CHECK_ON_A_PREVIOUS_CIRCUIT , "Continuity check performed on a previous circuit"},
643 static const true_false_string isup_echo_control_device_ind_value = {
644 "Echo control device included",
645 "Echo control device not included"
648 static const true_false_string isup_natnl_inatnl_call_ind_value = {
649 "Call to be treated as international call",
650 "Call to be treated as national call"
653 #define NO_END_TO_END_METHOD_AVAILABLE 0
654 #define PASS_ALONG_METHOD_AVAILABLE 1
655 #define SCCP_METHOD_AVAILABLE 2
656 #define PASS_ALONG_AND_SCCP_METHOD_AVAILABLE 3
657 static const value_string isup_end_to_end_method_ind_value[] = {
658 { NO_END_TO_END_METHOD_AVAILABLE, "No End-to-end method available (only link-by-link method available)"},
659 { PASS_ALONG_METHOD_AVAILABLE, "Pass-along method available (national use)"},
660 { SCCP_METHOD_AVAILABLE, "SCCP method available"},
661 { PASS_ALONG_AND_SCCP_METHOD_AVAILABLE, "pass-along and SCCP method available (national use)"},
664 static const true_false_string isup_interworking_ind_value = {
665 "interworking encountered",
666 "no interworking encountered (No.7 signalling all the way)"
669 static const true_false_string isup_end_to_end_info_ind_value = {
670 "end-to-end information available",
671 "no end-to-end information available"
674 static const true_false_string isup_ISDN_user_part_ind_value = {
675 "ISDN user part used all the way",
676 "ISDN user part not used all the way"
679 #define ISUP_PREFERRED_ALL_THE_WAY 0
680 #define ISUP_NOT_REQUIRED_ALL_THE_WAY 1
681 #define ISUP_REQUIRED_ALL_WAY 2
682 #define ISUP_ISDN_USER_PART_IND_SPARE 3
683 static const value_string isup_preferences_ind_value[] = {
684 { ISUP_PREFERRED_ALL_THE_WAY, "ISDN user part preferred all the way"},
685 { ISUP_NOT_REQUIRED_ALL_THE_WAY, "ISDN user part not required all the way"},
686 { ISUP_REQUIRED_ALL_WAY, "ISDN user part required all the way"},
687 { ISUP_ISDN_USER_PART_IND_SPARE, "spare"},
690 static const true_false_string isup_ISDN_originating_access_ind_value = {
691 "originating access ISDN",
692 "originating access non-ISDN"
695 static const true_false_string isup_ISDN_ported_num_trans_ind_value = {
697 "number not translated"
700 static const true_false_string isup_ISDN_qor_attempt_ind_value = {
701 "QoR routing attempt in progress",
702 "no QoR routing attempt in progress"
705 #define NO_INDICATION 0
706 #define CONNECTIONLESS_METHOD_AVAILABLE 1
707 #define CONNECITON_ORIENTED_METHOD_AVAILABLE 2
708 #define CONNECTIONLESS_AND_ORIENTED_METHOD_AVAILABLE 3
709 static const value_string isup_SCCP_method_ind_value[] = {
710 { NO_INDICATION, "No indication"},
711 { CONNECTIONLESS_METHOD_AVAILABLE, "Connectionless method available (national use)"},
712 { CONNECITON_ORIENTED_METHOD_AVAILABLE, "Connection oriented method available"},
713 { CONNECTIONLESS_AND_ORIENTED_METHOD_AVAILABLE, "Connectionless and -oriented method available (national use)"},
716 #define UNKNOWN_AT_THIS_TIME 0
717 #define OPERATOR_FRENCH 1
718 #define OPERATOR_ENGLISH 2
719 #define OPERATOR_GERMAN 3
720 #define OPERATOR_RUSSIAN 4
721 #define OPERATOR_SPANISH 5
722 #define ORDINARY_CALLING_SUBSCRIBER 10
723 #define CALLING_SUBSCRIBER_WITH_PRIORITY 11
727 const value_string isup_calling_partys_category_value[] = {
728 { UNKNOWN_AT_THIS_TIME, "Category unknown at this time (national use)"},
729 { OPERATOR_FRENCH, "operator, language French"},
730 { OPERATOR_ENGLISH, "operator, language English"},
731 { OPERATOR_GERMAN, "operator, language German"},
732 { OPERATOR_RUSSIAN, "operator, language Russian"},
733 { OPERATOR_SPANISH, "operator, language Spanish"},
734 { ORDINARY_CALLING_SUBSCRIBER, "ordinary calling subscriber"},
735 { CALLING_SUBSCRIBER_WITH_PRIORITY, "calling subscriber with priority"},
736 { DATA_CALL, "data call (voice band data)"},
737 { TEST_CALL, "test call"},
738 /* q.763-200212Amd2 */
739 { 14, "IEPS call marking for preferential call set up"},
740 { PAYPHONE, "payphone"},
743 #define CVR_RSP_IND_FAILURE 0
744 #define CVR_RSP_IND_SUCCESS 1
746 const value_string isup_cvr_rsp_ind_value[ ] = {
747 { CVR_RSP_IND_FAILURE, "CVR Response Fail" },
748 { CVR_RSP_IND_SUCCESS, "CVR Response Success" },
752 #define CVR_CG_IND_DOUBLE_SEIZE_NONE 0
753 #define CVR_CG_IND_DOUBLE_SEIZE_ODD 1
754 #define CVR_CG_IND_DOUBLE_SEIZE_EVEN 2
755 #define CVR_CG_IND_DOUBLE_SEIZE_ALL 3
757 const value_string isup_cvr_cg_double_seize_value[ ] = {
758 { CVR_CG_IND_DOUBLE_SEIZE_NONE, "Double Seize control NONE" },
759 { CVR_CG_IND_DOUBLE_SEIZE_ODD, "Double Seize control odd circuits"},
760 { CVR_CG_IND_DOUBLE_SEIZE_EVEN, "Double Seize control even circuits"},
761 { CVR_CG_IND_DOUBLE_SEIZE_ALL, "Double Seize control all circuits"},
765 #define CVR_CG_IND_CAR_IND_UNKNOWN 0
766 #define CVR_CG_IND_CAR_IND_ANALOG 1
767 #define CVR_CG_IND_CAR_IND_DIGITAL 2
768 #define CVR_CG_IND_CAR_IND_ANALOG_DIG 3
770 const value_string isup_cvr_cg_car_ind_value[ ] = {
771 { CVR_CG_IND_CAR_IND_UNKNOWN , "Carrier Type Unknown" },
772 { CVR_CG_IND_CAR_IND_ANALOG , "Carrier Type Analog" },
773 { CVR_CG_IND_CAR_IND_DIGITAL , "Carrier Type Digital"},
774 { CVR_CG_IND_CAR_IND_ANALOG_DIG, "Carrier Type Digital And Analog"},
778 #define CVR_CG_IND_ALARM_CAR_IND_UNKNOWN 0
779 #define CVR_CG_IND_ALARM_CAR_IND_SOFTWARE 1
780 #define CVR_CG_IND_ALARM_CAR_IND_HARDWARE 2
781 #define CVR_CG_IND_ALARM_CAR_IND_SPARE 3
783 const value_string isup_cvr_alarm_car_ind_value[ ] = {
784 { CVR_CG_IND_ALARM_CAR_IND_UNKNOWN , "Alarm Carrier Ind Default"},
785 { CVR_CG_IND_ALARM_CAR_IND_SOFTWARE , "Alarm Carrier Ind Software"},
786 { CVR_CG_IND_ALARM_CAR_IND_HARDWARE , "Alarm Carrier Ind Hardware"},
787 { CVR_CG_IND_ALARM_CAR_IND_SPARE , "Alarm Carrier Ind Spare"},
791 #define CVR_CG_IND_CONT_CHK_UNKNOWN 0
792 #define CVR_CG_IND_CONT_CHK_NONE 1
793 #define CVR_CG_IND_CONT_CHK_STAT 2
794 #define CVR_CG_IND_CONT_CHK_PER_CALL 3
796 const value_string isup_cvr_cont_chk_ind_value[ ] = {
798 { CVR_CG_IND_CONT_CHK_UNKNOWN , "Continuity Check Unknown"},
799 { CVR_CG_IND_CONT_CHK_NONE , "Continuity Check NONE"},
800 { CVR_CG_IND_CONT_CHK_STAT ,"Continuity Check Statistical"},
801 { CVR_CG_IND_CONT_CHK_PER_CALL ,"Continuity Check Per Call"},
805 #define MEDIUM_SPEECH 0
806 #define MEDIUM_64KBS 2
807 #define MEDIUM_3_1_KHZ_AUDIO 3
808 #define MEDIUM_RESERVED_SERVICE2_1 4
809 #define MEDIUM_RESERVED_SERVICE1_2 5
810 #define MEDIUM_64KBS_PREFERRED 6
811 #define MEDIUM_2_64KBS 7
812 #define MEDIUM_384KBS 8
813 #define MEDIUM_1536KBS 9
814 #define MEDIUM_1920KBS 10
815 #define MEDIUM_3_64KBS 16
816 #define MEDIUM_4_64KBS 17
817 #define MEDIUM_5_64KBS 18
818 #define MEDIUM_7_64KBS 20
819 #define MEDIUM_8_64KBS 21
820 #define MEDIUM_9_64KBS 22
821 #define MEDIUM_10_64KBS 23
822 #define MEDIUM_11_64KBS 24
823 #define MEDIUM_12_64KBS 25
824 #define MEDIUM_13_64KBS 26
825 #define MEDIUM_14_64KBS 27
826 #define MEDIUM_15_64KBS 28
827 #define MEDIUM_16_64KBS 29
828 #define MEDIUM_17_64KBS 30
829 #define MEDIUM_18_64KBS 31
830 #define MEDIUM_19_64KBS 32
831 #define MEDIUM_20_64KBS 33
832 #define MEDIUM_21_64KBS 34
833 #define MEDIUM_22_64KBS 35
834 #define MEDIUM_23_64KBS 36
835 #define MEDIUM_25_64KBS 38
836 #define MEDIUM_26_64KBS 39
837 #define MEDIUM_27_64KBS 40
838 #define MEDIUM_28_64KBS 41
839 #define MEDIUM_29_64KBS 42
841 const value_string isup_transmission_medium_requirement_value[] = {
842 { MEDIUM_SPEECH, "speech"},
843 { MEDIUM_64KBS, "64 kbit/s unrestricted"},
844 { MEDIUM_3_1_KHZ_AUDIO, "3.1 kHz audio"},
845 { MEDIUM_RESERVED_SERVICE2_1, "reserved for alternate speech (service 2)/64 kbit/s unrestricted (service 1)"},
846 { MEDIUM_RESERVED_SERVICE1_2, "reserved for alternate 64 kbit/s unrestricted (service 1)/speech (service 2)"},
847 { MEDIUM_64KBS_PREFERRED, "64 kbit/s preferred"},
848 { MEDIUM_2_64KBS, "2x64 kbit/s unrestricted"},
849 { MEDIUM_384KBS, "384 kbit/s unrestricted"},
850 { MEDIUM_1536KBS, "1536 kbit/s unrestricted"},
851 { MEDIUM_1920KBS, "1920 kbit/s unrestricted"},
852 { MEDIUM_3_64KBS, "3x64 kbit/s unrestricted"},
853 { MEDIUM_4_64KBS, "4x64 kbit/s unrestricted"},
854 { MEDIUM_5_64KBS, "5x64 kbit/s unrestricted"},
855 { MEDIUM_7_64KBS, "7x64 kbit/s unrestricted"},
856 { MEDIUM_8_64KBS, "8x64 kbit/s unrestricted"},
857 { MEDIUM_9_64KBS, "9x64 kbit/s unrestricted"},
858 { MEDIUM_10_64KBS, "10x64 kbit/s unrestricted"},
859 { MEDIUM_11_64KBS, "11x64 kbit/s unrestricted"},
860 { MEDIUM_12_64KBS, "12x64 kbit/s unrestricted"},
861 { MEDIUM_13_64KBS, "13x64 kbit/s unrestricted"},
862 { MEDIUM_14_64KBS, "14x64 kbit/s unrestricted"},
863 { MEDIUM_15_64KBS, "15x64 kbit/s unrestricted"},
864 { MEDIUM_16_64KBS, "16x64 kbit/s unrestricted"},
865 { MEDIUM_17_64KBS, "17x64 kbit/s unrestricted"},
866 { MEDIUM_18_64KBS, "18x64 kbit/s unrestricted"},
867 { MEDIUM_19_64KBS, "19x64 kbit/s unrestricted"},
868 { MEDIUM_20_64KBS, "20x64 kbit/s unrestricted"},
869 { MEDIUM_21_64KBS, "21x64 kbit/s unrestricted"},
870 { MEDIUM_22_64KBS, "22x64 kbit/s unrestricted"},
871 { MEDIUM_23_64KBS, "23x64 kbit/s unrestricted"},
872 { MEDIUM_25_64KBS, "25x64 kbit/s unrestricted"},
873 { MEDIUM_26_64KBS, "26x64 kbit/s unrestricted"},
874 { MEDIUM_27_64KBS, "27x64 kbit/s unrestricted"},
875 { MEDIUM_28_64KBS, "28x64 kbit/s unrestricted"},
876 { MEDIUM_29_64KBS, "29x64 kbit/s unrestricted"},
878 static const value_string isup_transmission_medium_requirement_prime_value[] = {
879 { MEDIUM_SPEECH, "speech"},
880 { MEDIUM_64KBS, "reserved for 64 kbit/s unrestricted"},
881 { MEDIUM_3_1_KHZ_AUDIO, "3.1 kHz audio"},
882 { MEDIUM_RESERVED_SERVICE2_1, "reserved for alternate speech (service 2)/64 kbit/s unrestricted (service 1)"},
883 { MEDIUM_RESERVED_SERVICE1_2, "reserved for alternate 64 kbit/s unrestricted (service 1)/speech (service 2)"},
884 { MEDIUM_64KBS_PREFERRED, "reserved for 64 kbit/s preferred"},
885 { MEDIUM_2_64KBS, "reserved for 2x64 kbit/s unrestricted"},
886 { MEDIUM_384KBS, "reserved for 384 kbit/s unrestricted"},
887 { MEDIUM_1536KBS, "reserved for 1536 kbit/s unrestricted"},
888 { MEDIUM_1920KBS, "reserved for 1920 kbit/s unrestricted"},
892 /* Definitions for Called and Calling Party number */
893 #define ISUP_ODD_EVEN_MASK 0x80
894 #define ISUP_NATURE_OF_ADDRESS_IND_MASK 0x7F
895 #define ISUP_INN_MASK 0x80
896 #define ISUP_NI_MASK 0x80
897 #define ISUP_NUMBERING_PLAN_IND_MASK 0x70
898 #define ISUP_ADDRESS_PRESENTATION_RESTR_IND_MASK 0x0C
899 #define ISUP_SCREENING_IND_MASK 0x03
900 #define ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK 0x0F
901 #define ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK 0xF0
903 static const true_false_string isup_odd_even_ind_value = {
904 "odd number of address signals",
905 "even number of address signals"
908 #define ISUP_CALLED_PARTY_NATURE_SUBSCRIBER_NR 1
909 #define ISUP_CALLED_PARTY_NATURE_UNKNOWN 2
910 #define ISUP_CALLED_PARTY_NATURE_NATIONAL_NR 3
911 #define ISUP_CALLED_PARTY_NATURE_INTERNATNL_NR 4
912 #define ISUP_CALLED_PARTY_NATURE_NETW_SPEC_NR 5
914 #define ISUP_CHARGE_NATURE_ANI_CGPA_SUB_NR 1
915 #define ISUP_CHARGE_NATURE_ANI_NA 2
916 #define ISUP_CHARGE_NATURE_ANI_CGPA_NAT_NR 3
917 #define ISUP_CHARGE_NATURE_ANI_CDPA_SUB_NR 5
918 #define ISUP_CHARGE_NATURE_ANI_CDPA_NO_NR 6
919 #define ISUP_CHARGE_NATURE_ANI_CDPA_NAT_NR 7
921 static const value_string isup_called_party_nature_of_address_ind_value[] = {
922 { ISUP_CALLED_PARTY_NATURE_SUBSCRIBER_NR, "subscriber number (national use)"},
923 { ISUP_CALLED_PARTY_NATURE_UNKNOWN, "unknown (national use)"},
924 { ISUP_CALLED_PARTY_NATURE_NATIONAL_NR, "national (significant) number"},
925 { ISUP_CALLED_PARTY_NATURE_INTERNATNL_NR, "international number"},
926 { ISUP_CALLED_PARTY_NATURE_NETW_SPEC_NR, "network-specific number (national use)"},
929 static const value_string isup_calling_party_nature_of_address_ind_value[] = {
930 { ISUP_CALLED_PARTY_NATURE_SUBSCRIBER_NR, "subscriber number (national use)"},
931 { ISUP_CALLED_PARTY_NATURE_UNKNOWN, "unknown (national use)"},
932 { ISUP_CALLED_PARTY_NATURE_NATIONAL_NR, "national (significant) number"},
933 { ISUP_CALLED_PARTY_NATURE_INTERNATNL_NR, "international number"},
936 static const value_string isup_charge_number_nature_of_address_ind_value[] = {
937 { ISUP_CHARGE_NATURE_ANI_CGPA_SUB_NR, "ANI of the calling party; subscriber number"},
938 { ISUP_CHARGE_NATURE_ANI_NA, "ANI not available or not provided"},
939 { ISUP_CHARGE_NATURE_ANI_CGPA_NAT_NR, "ANI of the calling party; national number"},
940 { ISUP_CHARGE_NATURE_ANI_CDPA_SUB_NR, "ANI of the called party; subscriber number"},
941 { ISUP_CHARGE_NATURE_ANI_CDPA_NO_NR, "ANI of the called party; no number present"},
942 { ISUP_CHARGE_NATURE_ANI_CDPA_NAT_NR, "ANI of the called party; national number"},
945 #define ISUP_GENERIC_NAME_PRESENTATION_ALLOWED 0
946 #define ISUP_GENERIC_NAME_PRESENTATION_RESTRICT 1
947 #define ISUP_GENERIC_NAME_PRESENTATION_BLOCK_TOGGLE 2
948 #define ISUP_GENERIC_NAME_PRESENTATION_NO_INDIC 3
949 #define ISUP_GENERIC_NAME_TYPE_SPARE 0
950 #define ISUP_GENERIC_NAME_TYPE_CALLING 1
951 #define ISUP_GENERIC_NAME_TYPE_ORIG_CALLED 2
952 #define ISUP_GENERIC_NAME_TYPE_REDIRECTING 3
953 #define ISUP_GENERIC_NAME_TYPE_CONNECTED 4
955 static const value_string isup_generic_name_presentation_value[] = {
956 { ISUP_GENERIC_NAME_PRESENTATION_ALLOWED, "presentation allowed"},
957 { ISUP_GENERIC_NAME_PRESENTATION_RESTRICT, "presentation restricted"},
958 { ISUP_GENERIC_NAME_PRESENTATION_BLOCK_TOGGLE, "blocking toggle"},
959 { ISUP_GENERIC_NAME_PRESENTATION_NO_INDIC, "no indication"},
962 static const true_false_string isup_generic_name_availability_value = {
963 "name not available",
964 "name available/unknown"
967 static const value_string isup_generic_name_type_value[] = {
968 { ISUP_GENERIC_NAME_TYPE_SPARE, "spare"},
969 { ISUP_GENERIC_NAME_TYPE_CALLING, "calling name"},
970 { ISUP_GENERIC_NAME_TYPE_ORIG_CALLED, "original called name"},
971 { ISUP_GENERIC_NAME_TYPE_REDIRECTING, "redirecting name"},
972 { ISUP_GENERIC_NAME_TYPE_CONNECTED, "connected name"},
978 static const true_false_string isup_INN_ind_value = {
979 "routing to internal network number not allowed",
980 "routing to internal network number allowed "
982 static const true_false_string isup_NI_ind_value = {
987 static const value_string isup_location_presentation_restricted_ind_value[] = {
988 { 0, "presentation allowed"},
989 { 1, "presentation restricted"},
990 { 2, "location not available"},
994 static const value_string isup_location_type_of_shape_value[] = {
995 { 0, "ellipsoid point"},
996 { 1, "ellipsoid point with uncertainty"},
997 { 2, "point with altitude and uncertainty"},
998 { 3, "ellipse on the ellipsoid"},
999 { 4, "ellipsoid circle sector"},
1003 #define ISDN_NUMBERING_PLAN 1
1004 #define DATA_NUMBERING_PLAN 3
1005 #define TELEX_NUMBERING_PLAN 4
1006 static const value_string isup_numbering_plan_ind_value[] = {
1007 { ISDN_NUMBERING_PLAN, "ISDN (Telephony) numbering plan"},
1008 { DATA_NUMBERING_PLAN, "Data numbering plan (national use)"},
1009 { TELEX_NUMBERING_PLAN, "Telex numbering plan (national use)"},
1010 { 5, "Reserved for national use"},
1011 { 6, "Reserved for national use"},
1014 #define ADDRESS_PRESETATION_ALLOWED 0
1015 #define ADDRESS_PRESETATION_RESTRICTED 1
1016 #define ADDRESS_NOT_AVAILABLE 2
1017 static const value_string isup_address_presentation_restricted_ind_value[] = {
1018 { ADDRESS_PRESETATION_ALLOWED, "presentation allowed"},
1019 { ADDRESS_PRESETATION_RESTRICTED, "presentation restricted"},
1020 { ADDRESS_NOT_AVAILABLE, "address not available (national use)"},
1024 static const value_string isup_screening_ind_value[] = {
1026 { 1, "user provided, verified and passed"},
1028 { 3, "network provided"},
1031 static const value_string isup_screening_ind_enhanced_value[] = {
1032 { 0, "user provided, not verified"},
1033 { 1, "user provided, verified and passed"},
1034 { 2, "user provided, verified and failed"},
1035 { 3, "network provided"},
1038 static const value_string isup_called_party_address_digit_value[] = {
1052 { 15, "Stop sending"},
1055 static const value_string isup_calling_party_address_digit_value[] = {
1072 /*End of Called/Calling party address definitions */
1075 static const true_false_string isup_calling_party_address_request_ind_value = {
1076 "calling party address requested",
1077 "calling party address not requested"
1079 static const true_false_string isup_holding_ind_value = {
1080 "holding requested",
1081 "holding not requested"
1083 static const true_false_string isup_calling_partys_category_request_ind_value = {
1084 "Calling Party's category requested",
1085 "Calling Party's category not requested",
1087 static const true_false_string isup_charge_information_request_ind_value = {
1088 "Charge Information requested",
1089 "Charge Information not requested"
1091 static const true_false_string isup_malicious_call_identification_request_ind_value = {
1092 "Malicious call identification requested",
1093 "Malicious call identification not requested"
1096 #define CALLING_PARTY_ADDRESS_NOT_INCLUDED 0
1097 #define CALLING_PARTY_ADDRESS_NOT_AVAILABLE 1
1098 #define CALLING_PARTY_ADDRESS_INCLUDED 3
1099 static const value_string isup_calling_party_address_response_ind_value[] = {
1100 { CALLING_PARTY_ADDRESS_NOT_INCLUDED, "Calling party address not included"},
1101 { CALLING_PARTY_ADDRESS_NOT_AVAILABLE,"Calling party address not available"},
1103 { CALLING_PARTY_ADDRESS_INCLUDED, "Calling party address included"},
1106 static const true_false_string isup_hold_provided_ind_value = {
1110 static const true_false_string isup_calling_partys_category_response_ind_value = {
1111 "Calling Party's category included",
1112 "Calling Party's category not included",
1114 static const true_false_string isup_charge_information_response_ind_value = {
1115 "Charge Information included",
1116 "Charge Information not included"
1118 static const true_false_string isup_solicited_information_ind_value = {
1123 static const true_false_string isup_continuity_ind_value = {
1124 "Continuity check successful",
1125 "Continuity ckec failed"
1128 #define CHARGE_NO_IND 0
1129 #define CHARGE_NO_CHARGE 1
1130 #define CHARGE_CHARGE 2
1131 static const value_string isup_charge_ind_value[] = {
1132 { CHARGE_NO_IND, "No indication"},
1133 { CHARGE_NO_CHARGE, "No charge"},
1134 { CHARGE_CHARGE, "Charge"},
1138 #define CALLED_PARTYS_STATUS_NO_IND 0
1139 #define CALLED_PARTYS_STATUS_SUBSCR_FREE 1
1140 #define CALLED_PARTYS_STATUS_CONNECT_WHEN_FREE 2
1141 static const value_string isup_called_partys_status_ind_value[] = {
1142 { CALLED_PARTYS_STATUS_NO_IND, "No indication"},
1143 { CALLED_PARTYS_STATUS_SUBSCR_FREE, "Subscriber free"},
1144 { CALLED_PARTYS_STATUS_CONNECT_WHEN_FREE, "Connect when free (national use)"},
1148 #define CALLED_PARTYS_CATEGORY_NO_IND 0
1149 #define CALLED_PARTYS_CATEGORY_ORDINARY_SUBSCR 1
1150 #define CALLED_PARTYS_CATEGORY_PAYPHONE 2
1151 static const value_string isup_called_partys_category_ind_value[] = {
1152 { CALLED_PARTYS_CATEGORY_NO_IND, "No indication"},
1153 { CALLED_PARTYS_CATEGORY_ORDINARY_SUBSCR, "Ordinary subscriber"},
1154 { CALLED_PARTYS_CATEGORY_PAYPHONE, "Payphone"},
1158 static const true_false_string isup_ISDN_terminating_access_ind_value = {
1159 "terminating access ISDN",
1160 "terminating access non-ISDN"
1163 static const true_false_string isup_suspend_resume_ind_value = {
1164 "network initiated",
1165 "ISDN subscriber initiated"
1167 #define MAINTENANCE 0
1168 #define HARDWARE_FAILURE 1
1169 #define RES_FOR_NATNL_USE 2
1170 static const value_string isup_cgs_message_type_value[] = {
1171 { MAINTENANCE, "maintenance oriented"},
1172 { HARDWARE_FAILURE, "hardware failure oriented"},
1173 { RES_FOR_NATNL_USE, "reserved for national use (ISUP'84)"},
1177 #define USER_TO_USER_SERVICE 2
1178 static const value_string isup_facility_ind_value[] = {
1179 { USER_TO_USER_SERVICE, "user-to-user service"},
1182 #define MTC_BLCK_STATE_TRANSIENT 0
1183 #define MTC_BLCK_STATE_UNEQUIPPED 3
1184 static const value_string isup_mtc_blocking_state_DC00_value[] = {
1185 { MTC_BLCK_STATE_TRANSIENT, "transient"},
1188 { MTC_BLCK_STATE_UNEQUIPPED, "unequipped"},
1191 #define MTC_BLCK_NO_BLOCKING 0
1192 #define MTC_LOCALLY_BLOCKED 1
1193 #define MTC_REMOTELY_BLOCKED 2
1194 #define MTC_LOCAL_REMOTE_BLOCKED 3
1195 static const value_string isup_mtc_blocking_state_DCnot00_value[] = {
1196 { MTC_BLCK_NO_BLOCKING, "no blocking (active)"},
1197 { MTC_LOCALLY_BLOCKED, "locally blocked"},
1198 { MTC_REMOTELY_BLOCKED, "remotely blocked"},
1199 { MTC_LOCAL_REMOTE_BLOCKED, "locally and remotely blocked"},
1202 #define CALL_PROC_INCOMING_BUSY 1
1203 #define CALL_PROC_OUTGOING_BUSY 2
1204 #define CALL_PROC_IDLE 3
1205 static const value_string isup_call_processing_state_value[] = {
1206 { CALL_PROC_INCOMING_BUSY, "circuit incoming busy"},
1207 { CALL_PROC_OUTGOING_BUSY, "circuit outgoing busy"},
1208 { CALL_PROC_IDLE, "idle"},
1211 #define HW_BLCK_NO_BLOCKING 0
1212 #define HW_LOCALLY_BLOCKED 1
1213 #define HW_REMOTELY_BLOCKED 2
1214 #define HW_LOCAL_REMOTE_BLOCKED 3
1215 static const value_string isup_HW_blocking_state_value[] = {
1216 { HW_BLCK_NO_BLOCKING, "no blocking (active)"},
1217 { HW_LOCALLY_BLOCKED, "locally blocked"},
1218 { HW_REMOTELY_BLOCKED, "remotely blocked"},
1219 { HW_LOCAL_REMOTE_BLOCKED, "locally and remotely blocked"},
1222 #define EVENT_ALERTING 1
1223 #define EVENT_PROGRESS 2
1224 #define EVENT_INBAND_INFO 3
1225 #define EVENT_ON_BUSY 4
1226 #define EVENT_ON_NO_REPLY 5
1227 #define EVENT_UNCONDITIONAL 6
1228 static const value_string isup_event_ind_value[] = {
1229 /* according 3.21/Q.763 */
1230 { EVENT_ALERTING, "ALERTING"},
1231 { EVENT_PROGRESS, "PROGRESS"},
1232 { EVENT_INBAND_INFO, "in-band information or an appropriate pattern is now available"},
1233 { EVENT_ON_BUSY, "call forwarded on busy (national use)"},
1234 { EVENT_ON_NO_REPLY, "call forwarded on no reply (national use)"},
1235 { EVENT_UNCONDITIONAL,"call forwarded unconditional (national use)"},
1238 static const true_false_string isup_event_presentation_restricted_ind_value = {
1239 /* according 3.21/Q.763 */
1240 "presentation restricted",
1243 #define CUG_NON_CUG_CALL 0
1244 #define CUG_CALL_OUTGOING_ACCESS_ALLOWED 2
1245 #define CUG_CALL_OUTGOING_ACCESS_NOT_ALLOWED 3
1246 static const value_string isup_CUG_call_ind_value[] = {
1247 /* according 3.38/Q.763 */
1248 { CUG_NON_CUG_CALL, "non-CUG call"},
1250 { CUG_CALL_OUTGOING_ACCESS_ALLOWED, "closed user group call, outgoing access allowed"},
1251 { CUG_CALL_OUTGOING_ACCESS_NOT_ALLOWED, "closed user group call, outgoing access not allowed"},
1255 static const true_false_string isup_simple_segmentation_ind_value = {
1256 /* according 3.38/Q.763 */
1257 "additional information will be sent in a segmentation message",
1258 "no additional information will be sent"
1261 static const true_false_string isup_connected_line_identity_request_ind_value = {
1262 /* according 3.38/Q.763 */
1267 static const value_string isup_redirecting_ind_value[] = {
1268 /* according 3.45/Q.763 */
1269 { 0, "no redirection (national use)"},
1270 { 1, "call rerouted (national use)"},
1271 { 2, "call rerouted, all redirection information presentation restricted (national use)"},
1272 { 3, "call diverted"},
1273 { 4, "call diverted, all redirection information presentation restricted"},
1274 { 5, "call rerouted, redirection number presentation restricted (national use)"},
1275 { 6, "call diversion, redirection number presentation restricted (national use)"},
1279 static const value_string isup_original_redirection_reason_value[] = {
1280 /* according 3.45/Q.763 */
1281 { 0, "unknown/not available"},
1282 { 1, "user busy (national use)"},
1283 { 2, "no reply (national use)"},
1284 { 3, "unconditional (national use)"},
1287 static const value_string isup_redirection_reason_value[] = {
1288 /* according 3.45/Q.763 */
1289 { 0, "unknown/not available"},
1290 { 1, "user busy (national use)"},
1291 { 2, "no reply (national use)"},
1292 { 3, "unconditional (national use)"},
1293 { 4, "deflection during alerting"},
1294 { 5, "deflection immediate response"},
1295 { 6, "mobile subscriber not reachable"},
1298 static const value_string isup_type_of_network_identification_value[] = {
1299 /* according 3.53/Q.763 */
1300 { 0, "CCITT/ITU-T-standardized identification"},
1301 { 2, "national network identification"},
1304 static const value_string isup_network_identification_plan_value[] = {
1305 /* according 3.53/Q.763 */
1306 { 0, "if CCITT/ITU-T id - unknown"},
1307 { 3, "if CCITT/ITU-T id - public data network id code (X.121)"},
1308 { 6, "if CCITT/ITU-T id - public land Mobile Network id code (E.211)"},
1311 static const value_string isup_map_type_value[] = {
1312 /* according 3.69/Q.763 */
1313 { 1, "1544 kbit/s digital path map format (64 kbit/s base rate"},
1314 { 2, "2048 kbit/s digital path map format (64 kbit/s base rate"},
1317 static const value_string isup_auto_congestion_level_value[] = {
1318 /* according 3.4/Q.763 */
1319 { 1, "Congestion level 1 exceeded"},
1320 { 2, "Congestion level 2 exceeded"},
1323 static const true_false_string isup_inband_information_ind_value = {
1324 /* according 3.37/Q.763 */
1325 "in-band information or an appropriate pattern is now available",
1328 static const true_false_string isup_call_diversion_may_occur_ind_value = {
1329 /* according 3.37/Q.763 */
1330 "call diversion may occur",
1333 static const true_false_string isup_MLPP_user_ind_value = {
1334 /* according 3.37/Q.763 */
1339 static const true_false_string isup_access_delivery_ind_value = {
1340 /* according 3.2/Q.763 */
1341 "No set-up message generated",
1342 "Set-up message generated"
1345 static const value_string isup_loop_prevention_response_ind_value[] = {
1346 /* according 3.67/Q.763 */
1347 { 0, "insufficient information"},
1348 { 1, "no loop exists"},
1349 { 2, "simultaneous transfer"},
1352 static const true_false_string isup_temporary_alternative_routing_ind_value = {
1353 /* according 3.68/Q.763 */
1354 "TAR controlled call",
1357 static const true_false_string isup_extension_ind_value = {
1358 /* according 3.68/Q.763 */
1360 "information continues through the next octet"
1365 static const value_string isup_call_to_be_diverted_ind_value[] = {
1366 /* according 3.72/Q.763 */
1367 { 0, "no indication"},
1368 { 1, "call diversion allowed"},
1369 { 2, "call diversion not allowed"},
1373 static const value_string isup_call_to_be_offered_ind_value[] = {
1374 /* according 3.72/Q.763 */
1375 { 0, "no indication"},
1376 { 1, "call offering not allowed"},
1377 { 2, "call offering allowed"},
1381 static const value_string isup_conference_acceptance_ind_value[] = {
1382 /* according 3.76/Q.763 */
1383 { 0, "no indication"},
1384 { 1, "accept conference request"},
1385 { 2, "reject conference request"},
1389 static const value_string isup_application_transport_parameter_value[] = {
1390 /* according 3.82/Q.763 */
1391 { 0, "Unidentified Context and Error Handling (UCEH) ASE"},
1392 { 1, "PSS1 ASE (VPN)"},
1394 { 3, "Charging ASE"},
1397 { 6, "Enhanced Unidentified Context and Error Handling ASE (EUCEH ASE)"},
1400 static const true_false_string isup_Release_call_indicator_value = {
1402 "do not release call"
1405 static const true_false_string isup_Send_notification_ind_value = {
1406 "send notification",
1407 "do not send notification"
1409 static const value_string isup_APM_segmentation_ind_value[] = {
1411 { 0x00, "final segment"},
1412 { 0x01, "number of following segments"},
1413 { 0x02, "number of following segments"},
1414 { 0x03, "number of following segments"},
1415 { 0x04, "number of following segments"},
1416 { 0x05, "number of following segments"},
1417 { 0x06, "number of following segments"},
1418 { 0x07, "number of following segments"},
1419 { 0x08, "number of following segments"},
1420 { 0x09, "number of following segments"},
1423 static const true_false_string isup_Sequence_ind_value = {
1425 "subsequent segment to first segment"
1429 /* Generalized bit masks for 8 and 16 bits fields */
1430 #define A_8BIT_MASK 0x01
1431 #define B_8BIT_MASK 0x02
1432 #define C_8BIT_MASK 0x04
1433 #define D_8BIT_MASK 0x08
1434 #define E_8BIT_MASK 0x10
1435 #define F_8BIT_MASK 0x20
1436 #define G_8BIT_MASK 0x40
1437 #define H_8BIT_MASK 0x80
1439 #define BA_8BIT_MASK 0x03
1440 #define CB_8BIT_MASK 0x06
1441 #define DC_8BIT_MASK 0x0C
1442 #define ED_8BIT_MASK 0x18
1443 #define FE_8BIT_MASK 0x30
1444 #define GF_8BIT_MASK 0x60
1445 #define HG_8BIT_MASK 0xC0
1446 #define GFE_8BIT_MASK 0x70
1447 #define HGF_8BIT_MASK 0xE0
1448 #define DCBA_8BIT_MASK 0x0F
1449 #define EDCBA_8BIT_MASK 0x1F
1450 #define HGFE_8BIT_MASK 0xF0
1451 #define GFEDCBA_8BIT_MASK 0x7F
1452 #define FEDCBA_8BIT_MASK 0x3F
1454 #define A_16BIT_MASK 0x0100
1455 #define B_16BIT_MASK 0x0200
1456 #define C_16BIT_MASK 0x0400
1457 #define D_16BIT_MASK 0x0800
1458 #define E_16BIT_MASK 0x1000
1459 #define F_16BIT_MASK 0x2000
1460 #define G_16BIT_MASK 0x4000
1461 #define H_16BIT_MASK 0x8000
1462 #define I_16BIT_MASK 0x0001
1463 #define J_16BIT_MASK 0x0002
1464 #define K_16BIT_MASK 0x0004
1465 #define L_16BIT_MASK 0x0008
1466 #define M_16BIT_MASK 0x0010
1467 #define N_16BIT_MASK 0x0020
1468 #define O_16BIT_MASK 0x0040
1469 #define P_16BIT_MASK 0x0080
1471 #define BA_16BIT_MASK 0x0300
1472 #define CB_16BIT_MASK 0x0600
1473 #define DC_16BIT_MASK 0x0C00
1474 #define FE_16BIT_MASK 0x3000
1475 #define HG_16BIT_MASK 0xC000
1476 #define KJ_16BIT_MASK 0x0006
1477 #define PO_16BIT_MASK 0x00C0
1479 #define CBA_16BIT_MASK 0x0700
1480 #define KJI_16BIT_MASK 0x0007
1481 #define HGFE_16BIT_MASK 0xF000
1482 #define PONM_16BIT_MASK 0x00F0
1484 /* Initialize the protocol and registered fields */
1485 static int proto_isup = -1;
1486 static int proto_bicc = -1;
1487 static module_t *isup_module;
1489 static gboolean isup_show_cic_in_info = TRUE;
1491 static int hf_isup_called = -1;
1492 static int hf_isup_calling = -1;
1493 static int hf_isup_redirecting = -1;
1495 static int hf_isup_cic = -1;
1496 static int hf_bicc_cic = -1;
1498 static int isup_tap = -1;
1500 static int hf_isup_message_type = -1;
1501 static int hf_isup_parameter_type = -1;
1502 static int hf_isup_parameter_length = -1;
1503 static int hf_isup_mandatory_variable_parameter_pointer = -1;
1504 static int hf_isup_pointer_to_start_of_optional_part = -1;
1506 static int hf_isup_cvr_rsp_ind = -1;
1507 static int hf_isup_cvr_cg_car_ind = -1;
1508 static int hf_isup_cvr_cg_double_seize = -1;
1509 static int hf_isup_cvr_cg_alarm_car_ind = -1;
1510 static int hf_isup_cvr_cont_chk_ind = -1;
1512 static int hf_isup_satellite_indicator = -1;
1513 static int hf_isup_continuity_check_indicator = -1;
1514 static int hf_isup_echo_control_device_indicator = -1;
1516 static int hf_isup_forw_call_natnl_inatnl_call_indicator = -1;
1517 static int hf_isup_forw_call_end_to_end_method_indicator = -1;
1518 static int hf_isup_forw_call_interworking_indicator = -1;
1519 static int hf_isup_forw_call_end_to_end_info_indicator = -1;
1520 static int hf_isup_forw_call_isdn_user_part_indicator = -1;
1521 static int hf_isup_forw_call_preferences_indicator = -1;
1522 static int hf_isup_forw_call_isdn_access_indicator = -1;
1523 static int hf_isup_forw_call_ported_num_trans_indicator = -1;
1524 static int hf_isup_forw_call_qor_attempt_indicator = -1;
1525 static int hf_isup_forw_call_sccp_method_indicator = -1;
1527 static int hf_isup_calling_partys_category = -1;
1529 static int hf_isup_transmission_medium_requirement = -1;
1531 static int hf_isup_odd_even_indicator = -1;
1532 static int hf_isup_called_party_nature_of_address_indicator = -1;
1533 static int hf_isup_calling_party_nature_of_address_indicator = -1;
1534 static int hf_isup_inn_indicator = -1;
1535 static int hf_isup_ni_indicator = -1;
1536 static int hf_isup_numbering_plan_indicator = -1;
1537 static int hf_isup_address_presentation_restricted_indicator = -1;
1538 static int hf_isup_screening_indicator = -1;
1539 static int hf_isup_screening_indicator_enhanced = -1;
1540 static int hf_isup_called_party_odd_address_signal_digit = -1;
1541 static int hf_isup_calling_party_odd_address_signal_digit = -1;
1542 static int hf_isup_called_party_even_address_signal_digit = -1;
1543 static int hf_isup_calling_party_even_address_signal_digit = -1;
1545 static int hf_isup_generic_name_presentation = -1;
1546 static int hf_isup_generic_name_availability = -1;
1547 static int hf_isup_generic_name_type = -1;
1548 static int hf_isup_generic_name_ia5 = -1;
1550 static int hf_isup_OECD_inf_ind = -1;
1551 static int hf_isup_IECD_inf_ind = -1;
1552 static int hf_isup_OECD_req_ind = -1;
1553 static int hf_isup_IECD_req_ind = -1;
1555 static int hf_isup_calling_party_address_request_indicator = -1;
1556 static int hf_isup_info_req_holding_indicator = -1;
1557 static int hf_isup_calling_partys_category_request_indicator = -1;
1558 static int hf_isup_charge_information_request_indicator = -1;
1559 static int hf_isup_charge_number_nature_of_address_indicator = -1;
1560 static int hf_isup_malicious_call_identification_request_indicator = -1;
1562 static int hf_isup_calling_party_address_response_indicator = -1;
1563 static int hf_isup_hold_provided_indicator = -1;
1564 static int hf_isup_calling_partys_category_response_indicator = -1;
1565 static int hf_isup_charge_information_response_indicator = -1;
1566 static int hf_isup_solicited_indicator = -1;
1568 static int hf_isup_continuity_indicator = -1;
1570 static int hf_isup_backw_call_charge_ind = -1 ;
1571 static int hf_isup_backw_call_called_partys_status_ind = -1;
1572 static int hf_isup_backw_call_called_partys_category_ind = -1;
1573 static int hf_isup_backw_call_end_to_end_method_ind = -1;
1574 static int hf_isup_backw_call_interworking_ind = -1;
1575 static int hf_isup_backw_call_end_to_end_info_ind = -1;
1576 static int hf_isup_backw_call_isdn_user_part_ind = -1;
1577 static int hf_isup_backw_call_holding_ind = -1;
1578 static int hf_isup_backw_call_isdn_access_ind = -1;
1579 static int hf_isup_backw_call_echo_control_device_ind = -1;
1580 static int hf_isup_backw_call_sccp_method_ind = -1;
1582 static int hf_isup_cause_indicator = -1;
1583 static int hf_ansi_isup_cause_indicator = -1;
1585 static int hf_isup_suspend_resume_indicator = -1;
1587 static int hf_isup_range_indicator = -1;
1588 static int hf_isup_cgs_message_type = -1;
1590 static int hf_isup_mtc_blocking_state1 = -1;
1591 static int hf_isup_mtc_blocking_state2 = -1;
1592 static int hf_isup_call_proc_state = -1;
1593 static int hf_isup_hw_blocking_state = -1;
1595 static int hf_isup_event_ind = -1;
1596 static int hf_isup_event_presentation_restricted_ind = -1;
1598 static int hf_isup_cug_call_ind = -1;
1599 static int hf_isup_simple_segmentation_ind = -1;
1600 static int hf_isup_connected_line_identity_request_ind = -1;
1602 static int hf_isup_redirecting_ind = -1;
1603 static int hf_isup_original_redirection_reason = -1;
1604 static int hf_isup_redirection_counter = -1;
1605 static int hf_isup_redirection_reason = -1;
1607 static int hf_isup_type_of_network_identification = -1;
1608 static int hf_isup_network_identification_plan = -1;
1610 static int hf_isup_map_type = -1;
1612 static int hf_isup_automatic_congestion_level = -1;
1614 static int hf_isup_inband_information_ind = -1;
1615 static int hf_isup_call_diversion_may_occur_ind = -1;
1616 static int hf_isup_mlpp_user_ind = -1;
1618 static int hf_isup_UUI_type = -1;
1619 static int hf_isup_UUI_req_service1 = -1;
1620 static int hf_isup_UUI_req_service2 = -1;
1621 static int hf_isup_UUI_req_service3 = -1;
1622 static int hf_isup_UUI_res_service1 = -1;
1623 static int hf_isup_UUI_res_service2 = -1;
1624 static int hf_isup_UUI_res_service3 = -1;
1625 static int hf_isup_UUI_network_discard_ind = -1;
1626 static int hf_isup_access_delivery_ind = -1;
1628 static int hf_isup_transmission_medium_requirement_prime = -1;
1630 static int hf_isup_loop_prevention_response_ind = -1;
1632 static int hf_isup_temporary_alternative_routing_ind = -1;
1633 static int hf_isup_extension_ind = -1;
1635 static int hf_isup_call_to_be_diverted_ind = -1;
1637 static int hf_isup_call_to_be_offered_ind = -1;
1639 static int hf_isup_conference_acceptance_ind = -1;
1641 static int hf_isup_transit_at_intermediate_exchange_ind = -1;
1642 static int hf_isup_Release_call_ind = -1;
1643 static int hf_isup_Send_notification_ind = -1;
1644 static int hf_isup_Discard_message_ind_value = -1;
1645 static int hf_isup_Discard_parameter_ind = -1;
1646 static int hf_isup_Pass_on_not_possible_indicator = -1;
1647 static int hf_isup_pass_on_not_possible_indicator2 = -1;
1648 static int hf_isup_Broadband_narrowband_interworking_ind = -1;
1649 static int hf_isup_Broadband_narrowband_interworking_ind2 = -1;
1651 static int hf_isup_app_cont_ident = -1;
1652 static int hf_isup_app_Send_notification_ind = -1;
1653 static int hf_isup_apm_segmentation_ind = -1;
1654 static int hf_isup_apm_si_ind = -1;
1655 static int hf_isup_apm_slr = -1;
1656 static int hf_isup_orig_addr_len = -1;
1657 static int hf_isup_dest_addr_len = -1;
1658 static int hf_isup_app_Release_call_ind = -1;
1659 static int hf_isup_cause_location = -1;
1661 static int hf_ansi_isup_coding_standard = -1;
1663 static int hf_length_indicator = -1;
1664 static int hf_afi = -1;
1665 static int hf_bicc_nsap_dsp = -1;
1666 static int hf_bat_ase_identifier = -1;
1668 static int hf_Action_Indicator = -1;
1670 static int hf_Instruction_ind_for_general_action = -1;
1672 static int hf_Send_notification_ind_for_general_action = -1;
1674 static int hf_Instruction_ind_for_pass_on_not_possible = -1;
1676 static int hf_Send_notification_ind_for_pass_on_not_possible = -1;
1677 static int hf_BCTP_Version_Indicator = -1;
1678 static int hf_Tunnelled_Protocol_Indicator = -1;
1679 static int hf_TPEI = -1;
1680 static int hf_BVEI = -1;
1681 static int hf_bncid = -1;
1682 static int hf_bat_ase_biwfa = -1;
1683 static int hf_characteristics = -1;
1685 static int hf_Organization_Identifier = -1;
1686 static int hf_codec_type = -1;
1687 static int hf_etsi_codec_type = -1;
1688 static int hf_active_code_set = -1;
1689 static int hf_active_code_set_12_2 = -1;
1690 static int hf_active_code_set_10_2 = -1;
1691 static int hf_active_code_set_7_95 = -1;
1692 static int hf_active_code_set_7_40 = -1;
1693 static int hf_active_code_set_6_70 = -1;
1694 static int hf_active_code_set_5_90 = -1;
1695 static int hf_active_code_set_5_15 = -1;
1696 static int hf_active_code_set_4_75 = -1;
1697 static int hf_supported_code_set = -1;
1698 static int hf_supported_code_set_12_2 = -1;
1699 static int hf_supported_code_set_10_2 = -1;
1700 static int hf_supported_code_set_7_95 = -1;
1701 static int hf_supported_code_set_7_40 = -1;
1702 static int hf_supported_code_set_6_70 = -1;
1703 static int hf_supported_code_set_5_90 = -1;
1704 static int hf_supported_code_set_5_15 = -1;
1705 static int hf_supported_code_set_4_75 = -1;
1706 static int hf_optimisation_mode = -1;
1707 static int hf_max_codec_modes = -1;
1708 static int hf_bearer_control_tunneling = -1;
1709 static int hf_Local_BCU_ID = -1;
1710 static int hf_late_cut_trough_cap_ind = -1;
1711 static int hf_bat_ase_signal = -1;
1712 static int hf_bat_ase_duration = -1;
1713 static int hf_bat_ase_bearer_redir_ind = -1;
1714 static int hf_BAT_ASE_Comp_Report_Reason = -1;
1715 static int hf_BAT_ASE_Comp_Report_ident = -1;
1716 static int hf_BAT_ASE_Comp_Report_diagnostic = -1;
1717 static int hf_nsap_ipv4_addr = -1;
1718 static int hf_nsap_ipv6_addr = -1;
1719 static int hf_iana_icp = -1;
1721 static int hf_isup_geo_loc_presentation_restricted_ind = -1;
1722 static int hf_isup_geo_loc_screening_ind = -1;
1724 static int hf_isup_apm_msg_fragments = -1;
1725 static int hf_isup_apm_msg_fragment = -1;
1726 static int hf_isup_apm_msg_fragment_overlap = -1;
1727 static int hf_isup_apm_msg_fragment_overlap_conflicts = -1;
1728 static int hf_isup_apm_msg_fragment_multiple_tails = -1;
1729 static int hf_isup_apm_msg_fragment_too_long_fragment = -1;
1730 static int hf_isup_apm_msg_fragment_error = -1;
1731 static int hf_isup_apm_msg_reassembled_in = -1;
1733 /* Initialize the subtree pointers */
1734 static gint ett_isup = -1;
1735 static gint ett_isup_parameter = -1;
1736 static gint ett_isup_address_digits = -1;
1737 static gint ett_isup_pass_along_message = -1;
1738 static gint ett_isup_circuit_state_ind = -1;
1739 static gint ett_bat_ase = -1;
1740 static gint ett_bicc = -1;
1741 static gint ett_bat_ase_element = -1;
1742 static gint ett_bat_ase_iwfa = -1;
1743 static gint ett_acs = -1;
1744 static gint ett_scs = -1;
1746 static gint ett_isup_apm_msg_fragment = -1;
1747 static gint ett_isup_apm_msg_fragments = -1;
1750 static dissector_handle_t sdp_handle = NULL;
1751 static dissector_handle_t q931_ie_handle = NULL;
1753 /* Declarations to desegment APM Messages */
1754 static gboolean isup_apm_desegment = TRUE;
1756 static const fragment_items isup_apm_msg_frag_items = {
1757 /* Fragment subtrees */
1758 &ett_isup_apm_msg_fragment,
1759 &ett_isup_apm_msg_fragments,
1760 /* Fragment fields */
1761 &hf_isup_apm_msg_fragments,
1762 &hf_isup_apm_msg_fragment,
1763 &hf_isup_apm_msg_fragment_overlap,
1764 &hf_isup_apm_msg_fragment_overlap_conflicts,
1765 &hf_isup_apm_msg_fragment_multiple_tails,
1766 &hf_isup_apm_msg_fragment_too_long_fragment,
1767 &hf_isup_apm_msg_fragment_error,
1768 /* Reassembled in field */
1769 &hf_isup_apm_msg_reassembled_in,
1771 "ISUP APM Message fragments"
1774 static GHashTable *isup_apm_msg_fragment_table = NULL;
1775 static GHashTable *isup_apm_msg_reassembled_table = NULL;
1779 isup_apm_defragment_init(void)
1781 fragment_table_init (&isup_apm_msg_fragment_table);
1782 reassembled_table_init(&isup_apm_msg_reassembled_table);
1785 /* Info for the tap that must be passed between procedures */
1786 gchar *tap_called_number = NULL;
1787 gchar *tap_calling_number = NULL;
1788 guint8 tap_cause_value = 0;
1790 /* ------------------------------------------------------------------
1791 Mapping number to ASCII-character
1792 ------------------------------------------------------------------ */
1793 static char number_to_char(int number)
1796 return ((char) number + ASCII_NUMBER_DELTA);
1798 return ((char) number + ASCII_LETTER_DELTA);
1801 /* ------------------------------------------------------------------ */
1802 /* Dissectors for all used parameter types */
1803 /* ------------------------------------------------------------------ */
1804 /* argument tvbuff_t contains only parameter-specific length */
1805 /* length indicator is already dissected in dissect_isup_message() or */
1806 /* dissect_isup_optional_parameter() */
1807 /* ------------------------------------------------------------------ */
1808 /* ------------------------------------------------------------------
1809 Dissector Parameter circuit validation response indicator
1813 dissect_isup_cvr_response_ind_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1815 guint8 cvr_response_ind;
1817 cvr_response_ind = tvb_get_guint8(parameter_tvb, 0);
1818 proto_tree_add_uint(parameter_tree, hf_isup_cvr_rsp_ind, parameter_tvb, 0, CVR_RESP_IND_LENGTH, cvr_response_ind );
1819 proto_item_set_text(parameter_item, "Circuit Validation Test Response Indicator: 0x%x", cvr_response_ind );
1823 /* ------------------------------------------------------------------
1824 Dissector Parameter circuit validation response - circuit group
1828 dissect_isup_circuit_group_char_ind_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1830 guint8 cvr_cg_char_ind;
1832 cvr_cg_char_ind = tvb_get_guint8(parameter_tvb, 0);
1833 proto_tree_add_uint(parameter_tree, hf_isup_cvr_cg_car_ind, parameter_tvb, 0, CG_CHAR_IND_LENGTH, cvr_cg_char_ind );
1834 proto_tree_add_uint(parameter_tree, hf_isup_cvr_cg_double_seize, parameter_tvb, 0, CG_CHAR_IND_LENGTH, cvr_cg_char_ind );
1835 proto_tree_add_uint(parameter_tree, hf_isup_cvr_cg_alarm_car_ind, parameter_tvb, 0, CG_CHAR_IND_LENGTH, cvr_cg_char_ind );
1836 proto_tree_add_uint(parameter_tree, hf_isup_cvr_cont_chk_ind, parameter_tvb, 0, CG_CHAR_IND_LENGTH, cvr_cg_char_ind );
1838 proto_item_set_text(parameter_item, "Circuit Validation Test Response Circuit Group Characteristics: 0x%x", cvr_cg_char_ind );
1841 /* ------------------------------------------------------------------
1842 Dissector Parameter nature of connection flags
1845 dissect_isup_nature_of_connection_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1847 guint8 nature_of_connection_ind;
1849 nature_of_connection_ind = tvb_get_guint8(parameter_tvb, 0);
1850 proto_tree_add_uint(parameter_tree, hf_isup_satellite_indicator, parameter_tvb, 0,NATURE_OF_CONNECTION_IND_LENGTH, nature_of_connection_ind);
1851 proto_tree_add_uint(parameter_tree, hf_isup_continuity_check_indicator, parameter_tvb, 0,NATURE_OF_CONNECTION_IND_LENGTH, nature_of_connection_ind);
1852 proto_tree_add_boolean(parameter_tree, hf_isup_echo_control_device_indicator, parameter_tvb, 0, NATURE_OF_CONNECTION_IND_LENGTH, nature_of_connection_ind);
1854 proto_item_set_text(parameter_item, "Nature of Connection Indicators: 0x%x", nature_of_connection_ind);
1857 /* ------------------------------------------------------------------
1858 Dissector Parameter Forward Call Indicators
1861 dissect_isup_forward_call_indicators_parameter(tvbuff_t *parameter_tvb,proto_tree *parameter_tree, proto_item *parameter_item)
1863 guint16 forward_call_ind;
1865 forward_call_ind = tvb_get_ntohs(parameter_tvb, 0);
1866 proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_natnl_inatnl_call_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1867 proto_tree_add_uint(parameter_tree, hf_isup_forw_call_end_to_end_method_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1868 proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_interworking_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1869 proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_end_to_end_info_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1870 proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_isdn_user_part_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1871 proto_tree_add_uint(parameter_tree, hf_isup_forw_call_preferences_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1872 proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_isdn_access_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1873 proto_tree_add_uint(parameter_tree, hf_isup_forw_call_sccp_method_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1874 proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_ported_num_trans_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1875 proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_qor_attempt_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1877 proto_item_set_text(parameter_item, "Forward Call Indicators: 0x%x", forward_call_ind );
1880 /* ------------------------------------------------------------------
1881 Dissector Parameter Calling Party's Category
1884 dissect_isup_calling_partys_category_parameter(tvbuff_t *parameter_tvb,proto_tree *parameter_tree, proto_item *parameter_item)
1886 guint8 calling_partys_category;
1888 calling_partys_category = tvb_get_guint8(parameter_tvb, 0);
1889 proto_tree_add_uint(parameter_tree, hf_isup_calling_partys_category, parameter_tvb, 0, CALLING_PRTYS_CATEGORY_LENGTH, calling_partys_category);
1891 proto_item_set_text(parameter_item, "Calling Party's category: 0x%x (%s)", calling_partys_category, val_to_str(calling_partys_category, isup_calling_partys_category_value, "reserved/spare"));
1895 /* ------------------------------------------------------------------
1896 Dissector Parameter Transmission medium requirement
1899 dissect_isup_transmission_medium_requirement_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1901 guint8 transmission_medium_requirement;
1903 transmission_medium_requirement = tvb_get_guint8(parameter_tvb, 0);
1904 proto_tree_add_uint(parameter_tree, hf_isup_transmission_medium_requirement, parameter_tvb, 0, TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH,transmission_medium_requirement);
1906 proto_item_set_text(parameter_item, "Transmission medium requirement: %u (%s)", transmission_medium_requirement, val_to_str(transmission_medium_requirement, isup_transmission_medium_requirement_value, "spare"));
1908 /* ------------------------------------------------------------------
1909 Dissector Parameter Called party number
1912 dissect_isup_called_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1914 proto_item *address_digits_item;
1915 proto_tree *address_digits_tree;
1916 proto_item *hidden_item;
1917 guint8 indicators1, indicators2;
1918 guint8 address_digit_pair=0;
1922 char called_number[MAXDIGITS + 1]="";
1923 e164_info_t e164_info;
1926 indicators1 = tvb_get_guint8(parameter_tvb, 0);
1927 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1928 proto_tree_add_uint(parameter_tree, hf_isup_called_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1929 indicators2 = tvb_get_guint8(parameter_tvb, 1);
1930 number_plan = (indicators2 & 0x70)>> 4;
1931 proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
1932 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1935 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1937 "Called Party Number");
1938 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1940 while((length = tvb_reported_length_remaining(parameter_tvb, offset)) > 0){
1941 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1942 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1943 called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1945 THROW(ReportedBoundsError);
1946 if ((length - 1) > 0 ){
1947 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1948 called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1950 THROW(ReportedBoundsError);
1954 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1955 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1956 called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1958 THROW(ReportedBoundsError);
1961 called_number[i++] = '\0';
1962 proto_item_set_text(address_digits_item, "Called Party Number: %s", called_number);
1963 proto_item_set_text(parameter_item, "Called Party Number: %s", called_number);
1964 if ( number_plan == 1 ) {
1965 e164_info.e164_number_type = CALLED_PARTY_NUMBER;
1966 e164_info.nature_of_address = indicators1 & 0x7f;
1967 e164_info.E164_number_str = called_number;
1968 e164_info.E164_number_length = i - 1;
1969 dissect_e164_number(parameter_tvb, address_digits_tree, 2, (offset - 2), e164_info);
1970 hidden_item = proto_tree_add_string(address_digits_tree, hf_isup_called, parameter_tvb,
1971 offset - length, length, called_number);
1972 PROTO_ITEM_SET_HIDDEN(hidden_item);
1974 proto_tree_add_string(address_digits_tree, hf_isup_called, parameter_tvb,
1975 offset - length, length, called_number);
1977 tap_called_number = ep_strdup(called_number);
1979 /* ------------------------------------------------------------------
1980 Dissector Parameter Subsequent number
1983 dissect_isup_subsequent_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1985 proto_item *address_digits_item;
1986 proto_tree *address_digits_tree;
1988 guint8 address_digit_pair=0;
1992 char called_number[MAXDIGITS + 1]="";
1994 indicators1 = tvb_get_guint8(parameter_tvb, 0);
1995 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1998 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2000 "Subsequent Number");
2001 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2003 while((length = tvb_reported_length_remaining(parameter_tvb, offset)) > 0){
2004 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2005 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2006 called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2008 THROW(ReportedBoundsError);
2009 if ((length - 1) > 0 ){
2010 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2011 called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2013 THROW(ReportedBoundsError);
2018 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2019 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2020 called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2022 THROW(ReportedBoundsError);
2024 called_number[i++] = '\0';
2026 proto_item_set_text(address_digits_item, "Subsequent Number: %s", called_number);
2027 proto_item_set_text(parameter_item, "Subsequent Number: %s", called_number);
2030 /* ------------------------------------------------------------------
2031 Dissector Parameter Information Request Indicators
2034 dissect_isup_information_request_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2036 guint16 information_request_indicators;
2038 information_request_indicators = tvb_get_ntohs(parameter_tvb, 0);
2039 proto_tree_add_boolean(parameter_tree, hf_isup_calling_party_address_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
2040 proto_tree_add_boolean(parameter_tree, hf_isup_info_req_holding_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
2041 proto_tree_add_boolean(parameter_tree, hf_isup_calling_partys_category_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
2042 proto_tree_add_boolean(parameter_tree, hf_isup_charge_information_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
2043 proto_tree_add_boolean(parameter_tree, hf_isup_malicious_call_identification_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
2046 proto_item_set_text(parameter_item, "Information request indicators: 0x%x", information_request_indicators);
2048 /* ------------------------------------------------------------------
2049 Dissector Parameter Information Indicators
2052 dissect_isup_information_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2054 guint16 information_indicators;
2056 information_indicators = tvb_get_ntohs(parameter_tvb, 0);
2057 proto_tree_add_uint(parameter_tree, hf_isup_calling_party_address_response_indicator, parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
2058 proto_tree_add_boolean(parameter_tree, hf_isup_hold_provided_indicator, parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
2059 proto_tree_add_boolean(parameter_tree, hf_isup_calling_partys_category_response_indicator, parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
2060 proto_tree_add_boolean(parameter_tree, hf_isup_charge_information_response_indicator, parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
2061 proto_tree_add_boolean(parameter_tree, hf_isup_solicited_indicator, parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
2064 proto_item_set_text(parameter_item, "Information indicators: 0x%x", information_indicators);
2066 /* ------------------------------------------------------------------
2067 Dissector Parameter Continuity Indicators
2070 dissect_isup_continuity_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2072 guint8 continuity_indicators;
2074 continuity_indicators = tvb_get_guint8(parameter_tvb, 0);
2075 proto_tree_add_boolean(parameter_tree, hf_isup_continuity_indicator, parameter_tvb, 0, CONTINUITY_IND_LENGTH, continuity_indicators);
2077 proto_item_set_text(parameter_item, "Continuity indicators: 0x%x", continuity_indicators);
2079 /* ------------------------------------------------------------------
2080 Dissector Parameter Backward Call Indicators
2083 dissect_isup_backward_call_indicators_parameter(tvbuff_t *parameter_tvb,proto_tree *parameter_tree, proto_item *parameter_item)
2085 guint16 backward_call_ind;
2087 backward_call_ind = tvb_get_ntohs(parameter_tvb, 0);
2090 proto_tree_add_uint(parameter_tree, hf_isup_backw_call_charge_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2091 proto_tree_add_uint(parameter_tree, hf_isup_backw_call_called_partys_status_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2092 proto_tree_add_uint(parameter_tree, hf_isup_backw_call_called_partys_category_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2093 proto_tree_add_uint(parameter_tree, hf_isup_backw_call_end_to_end_method_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2094 proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_interworking_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2095 proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_end_to_end_info_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2096 proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_isdn_user_part_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2097 proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_holding_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2098 proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_isdn_access_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2099 proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_echo_control_device_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2100 proto_tree_add_uint(parameter_tree, hf_isup_backw_call_sccp_method_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
2102 proto_item_set_text(parameter_item, "Backward Call Indicators: 0x%x", backward_call_ind);
2104 /* ------------------------------------------------------------------
2105 Dissector Parameter Cause Indicators - no detailed dissection since defined in Rec. Q.850
2109 * Cause codes for Cause.
2110 * The decoding of cause indicators parameter field are defined in ITU-T
2111 * Recommendation Q.850; those are different from the ones in the Q.931
2112 * dissector, as that has some values not specified by the standard but
2113 * that appear to be used for purposes other than the ones in Q.850.
2115 const value_string q850_cause_code_vals[] = {
2116 { 0x00, "Valid cause code not yet received" },
2117 { 0x01, "Unallocated (unassigned) number" },
2118 { 0x02, "No route to specified transit network" },
2119 { 0x03, "No route to destination" },
2120 { 0x04, "Send special information tone" },
2121 { 0x05, "Misdialled trunk prefix" },
2122 { 0x06, "Channel unacceptable" },
2123 { 0x07, "Call awarded and being delivered in an established channel" },
2124 { 0x08, "Preemption" },
2125 { 0x09, "Preemption - circuit reserved for reuse" },
2126 { 0x0E, "QoR: ported number" },
2127 { 0x10, "Normal call clearing" },
2128 { 0x11, "User busy" },
2129 { 0x12, "No user responding" },
2130 { 0x13, "No answer from user (user alerted)" },
2131 { 0x14, "Subscriber absent" },
2132 { 0x15, "Call rejected" },
2133 { 0x16, "Number changed" },
2134 { 0x17, "Redirection to new destination" },
2135 { 0x18, "Call rejected due to feature at the destination" },
2136 { 0x19, "Exchange routing error" },
2137 { 0x1A, "Non-selected user clearing" },
2138 { 0x1B, "Destination out of order" },
2139 { 0x1C, "Invalid number format (address incomplete)" },
2140 { 0x1D, "Facility rejected" },
2141 { 0x1E, "Response to STATUS ENQUIRY" },
2142 { 0x1F, "Normal unspecified" },
2143 { 0x21, "Circuit out of order" },
2144 { 0x22, "No circuit/channel available" },
2145 { 0x26, "Network out of order" },
2146 { 0x27, "Permanent frame mode connection out of service" },
2147 { 0x28, "Permanent frame mode connection operational" },
2148 { 0x29, "Temporary failure" },
2149 { 0x2A, "Switching equipment congestion" },
2150 { 0x2B, "Access information discarded" },
2151 { 0x2C, "Requested circuit/channel not available" },
2152 { 0x2E, "Precedence call blocked" },
2153 { 0x2F, "Resources unavailable, unspecified" },
2154 { 0x31, "Quality of service unavailable" },
2155 { 0x32, "Requested facility not subscribed" },
2156 { 0x35, "Outgoing calls barred within CUG" },
2157 { 0x37, "Incoming calls barred within CUG" },
2158 { 0x38, "Call waiting not subscribed" },
2159 { 0x39, "Bearer capability not authorized" },
2160 { 0x3A, "Bearer capability not presently available" },
2161 { 0x3E, "Inconsistency in designated outgoing access information and subscriber class" },
2162 { 0x3F, "Service or option not available, unspecified" },
2163 { 0x41, "Bearer capability not implemented" },
2164 { 0x42, "Channel type not implemented" },
2165 { 0x45, "Requested facility not implemented" },
2166 { 0x46, "Only restricted digital information bearer capability is available" },
2167 { 0x4F, "Service or option not implemented, unspecified" },
2168 { 0x51, "Invalid call reference value" },
2169 { 0x52, "Identified channel does not exist" },
2170 { 0x53, "Call identity does not exist for suspended call" },
2171 { 0x54, "Call identity in use" },
2172 { 0x55, "No call suspended" },
2173 { 0x56, "Call having the requested call identity has been cleared" },
2174 { 0x57, "Called user not member of CUG" },
2175 { 0x58, "Incompatible destination" },
2176 { 0x5A, "Non-existing CUG" },
2177 { 0x5B, "Invalid transit network selection (national use)" },
2178 { 0x5F, "Invalid message, unspecified" },
2179 { 0x60, "Mandatory information element is missing" },
2180 { 0x61, "Message type non-existent or not implemented" },
2181 { 0x62, "Message not compatible with call state or message type non-existent or not implemented" },
2182 { 0x63, "Information element nonexistent or not implemented" },
2183 { 0x64, "Invalid information element contents" },
2184 { 0x65, "Message not compatible with call state" },
2185 { 0x66, "Recovery on timer expiry" },
2186 { 0x67, "Parameter non-existent or not implemented - passed on" },
2187 { 0x6E, "Message with unrecognized parameter discarded" },
2188 { 0x6F, "Protocol error, unspecified" },
2189 { 0x7F, "Internetworking, unspecified" },
2193 static const value_string ansi_isup_cause_code_vals[] = {
2194 { 0x00, "Valid cause code not yet received" },
2195 { 0x01, "Unallocated (unassigned) number" },
2196 { 0x02, "No route to specified transit network" },
2197 { 0x03, "No route to destination" },
2198 { 0x04, "Send special information tone" },
2199 { 0x05, "Misdialled trunk prefix" },
2200 { 0x06, "Channel unacceptable" },
2201 { 0x07, "Call awarded and being delivered in an established channel" },
2202 { 0x08, "Preemption" },
2203 { 0x09, "Preemption - circuit reserved for reuse" },
2204 { 0x0E, "QoR: ported number" },
2205 { 0x10, "Normal call clearing" },
2206 { 0x11, "User busy" },
2207 { 0x12, "No user responding" },
2208 { 0x13, "No answer from user (user alerted)" },
2209 { 0x14, "Subscriber absent" },
2210 { 0x15, "Call rejected" },
2211 { 0x16, "Number changed" },
2212 { 23, "Unallocated destination number" },
2213 { 24, "Undefined business group" },
2214 { 0x19, "Exchange routing error" },
2215 { 0x1A, "Non-selected user clearing" },
2216 { 0x1B, "Destination out of order" },
2217 { 0x1C, "Invalid number format (address incomplete)" },
2218 { 0x1D, "Facility rejected" },
2219 { 0x1E, "Response to STATUS ENQUIRY" },
2220 { 0x1F, "Normal unspecified" },
2221 { 0x21, "Circuit out of order" },
2222 { 0x22, "No circuit/channel available" },
2223 { 0x26, "Network out of order" },
2224 { 0x27, "Permanent frame mode connection out of service" },
2225 { 0x28, "Permanent frame mode connection operational" },
2226 { 0x29, "Temporary failure" },
2227 { 0x2A, "Switching equipment congestion" },
2228 { 0x2B, "Access information discarded" },
2229 { 0x2C, "Requested circuit/channel not available" },
2230 { 45, "Preemption" },
2231 { 0x2E, "Precedence call blocked" },
2232 { 0x2F, "Resources unavailable, unspecified" },
2233 { 0x31, "Quality of service unavailable" },
2234 { 0x32, "Requested facility not subscribed" },
2235 { 51, "Call type incompatible with service request" },
2236 { 0x35, "Outgoing calls barred within CUG" },
2237 { 54, "Call blocked due to group restriction" },
2238 { 0x37, "Incoming calls barred within CUG" },
2239 { 0x38, "Call waiting not subscribed" },
2240 { 0x39, "Bearer capability not authorized" },
2241 { 0x3A, "Bearer capability not presently available" },
2242 { 0x3E, "Inconsistency in designated outgoing access information and subscriber class" },
2243 { 0x3F, "Service or option not available, unspecified" },
2244 { 0x41, "Bearer capability not implemented" },
2245 { 0x42, "Channel type not implemented" },
2246 { 0x45, "Requested facility not implemented" },
2247 { 0x46, "Only restricted digital information bearer capability is available" },
2248 { 0x4F, "Service or option not implemented, unspecified" },
2249 { 0x51, "Invalid call reference value" },
2250 { 0x52, "Identified channel does not exist" },
2251 { 0x53, "Call identity does not exist for suspended call" },
2252 { 0x54, "Call identity in use" },
2253 { 0x55, "No call suspended" },
2254 { 0x56, "Call having the requested call identity has been cleared" },
2255 { 0x57, "Called user not member of CUG" },
2256 { 0x58, "Incompatible destination" },
2257 { 0x5A, "Non-existing CUG" },
2258 { 0x5B, "Invalid transit network selection (national use)" },
2259 { 0x5F, "Invalid message, unspecified" },
2260 { 0x60, "Mandatory information element is missing" },
2261 { 0x61, "Message type non-existent or not implemented" },
2262 { 0x62, "Message not compatible with call state or message type non-existent or not implemented" },
2263 { 0x63, "Information element nonexistent or not implemented" },
2264 { 0x64, "Invalid information element contents" },
2265 { 0x65, "Message not compatible with call state" },
2266 { 0x66, "Recovery on timer expiry" },
2267 { 0x67, "Parameter non-existent or not implemented - passed on" },
2268 { 0x6E, "Message with unrecognized parameter discarded" },
2269 { 0x6F, "Protocol error, unspecified" },
2270 { 0x7F, "Internetworking, unspecified" },
2274 static const value_string ansi_isup_coding_standard_vals[] = {
2275 { 0, "CCITT Standard" },
2276 { 1, "Reserved for other international standards" },
2277 { 2, "ANSI Standard" },
2282 dissect_isup_cause_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2283 { guint length = tvb_reported_length(parameter_tvb);
2284 proto_tree_add_text(parameter_tree, parameter_tvb,0, -1, "Cause indicators (-> Q.850)");
2285 dissect_q931_cause_ie(parameter_tvb,0,length,
2287 hf_isup_cause_indicator, &tap_cause_value, isup_parameter_type_value);
2288 proto_item_set_text(parameter_item, "Cause indicators, see Q.850 (%u byte%s length)", length , plurality(length, "", "s"));
2292 dissect_ansi_isup_cause_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2294 guint8 coding_standard;
2297 guint length = tvb_reported_length(parameter_tvb);
2299 coding_standard = (tvb_get_guint8(parameter_tvb, offset)&0x60)>>5;
2301 switch (coding_standard) {
2304 proto_tree_add_item(parameter_tree, hf_isup_cause_location, parameter_tvb, offset, 1, FALSE);
2305 proto_tree_add_item(parameter_tree, hf_ansi_isup_coding_standard, parameter_tvb, offset, 1, FALSE);
2306 proto_tree_add_item(parameter_tree, hf_isup_extension_ind, parameter_tvb, offset, 1, FALSE);
2311 proto_tree_add_item(parameter_tree, hf_isup_cause_indicator, parameter_tvb, offset, 1, FALSE);
2312 cause_value=tvb_get_guint8(parameter_tvb, offset)&0x7f;
2316 proto_item_set_text(parameter_item, "Cause indicators: %s (%u)", val_to_str(cause_value, q850_cause_code_vals, "spare"),cause_value );
2319 proto_tree_add_text(parameter_tree, parameter_tvb, offset,
2320 length, "Diagnostic: %s",
2321 tvb_bytes_to_str(parameter_tvb, offset, length));
2325 proto_tree_add_item(parameter_tree, hf_isup_cause_location, parameter_tvb, offset, 1, FALSE);
2326 proto_tree_add_item(parameter_tree, hf_ansi_isup_coding_standard, parameter_tvb, offset, 1, FALSE);
2327 proto_tree_add_item(parameter_tree, hf_isup_extension_ind, parameter_tvb, offset, 1, FALSE);
2332 proto_tree_add_item(parameter_tree, hf_ansi_isup_cause_indicator, parameter_tvb, offset, 1, FALSE);
2335 cause_value=tvb_get_guint8(parameter_tvb, offset)&0x7f;
2337 proto_item_set_text(parameter_item, "Cause indicators: %s (%u)", val_to_str(cause_value, ansi_isup_cause_code_vals, "spare"),cause_value );
2340 proto_tree_add_text(parameter_tree, parameter_tvb, offset,
2341 length, "Diagnostic: %s",
2342 tvb_bytes_to_str(parameter_tvb, offset, length));
2345 proto_tree_add_item(parameter_tree, hf_ansi_isup_coding_standard, parameter_tvb, offset, 1, FALSE);
2346 proto_tree_add_item(parameter_tree, hf_isup_extension_ind, parameter_tvb, offset, 1, FALSE);
2349 proto_item_set_text(parameter_item, "Cause indicators(%u byte%s length)", length , plurality(length, "", "s"));
2352 /* ------------------------------------------------------------------
2353 Dissector Parameter Suspend/Resume Indicators
2356 dissect_isup_suspend_resume_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2360 indicators = tvb_get_guint8(parameter_tvb, 0);
2361 proto_tree_add_boolean(parameter_tree, hf_isup_suspend_resume_indicator, parameter_tvb, 0, SUSPEND_RESUME_IND_LENGTH, indicators);
2363 proto_item_set_text(parameter_item, "Suspend/Resume indicator: 0x%x", indicators);
2365 /* ------------------------------------------------------------------
2366 Dissector Parameter Range and Status Indicators
2369 dissect_isup_range_and_status_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2371 guint8 range, actual_status_length;
2373 range = tvb_get_guint8(parameter_tvb, 0);
2374 proto_tree_add_uint_format(parameter_tree, hf_isup_range_indicator, parameter_tvb, 0, RANGE_LENGTH, range, "Range: %u", range);
2375 actual_status_length = tvb_reported_length_remaining(parameter_tvb, RANGE_LENGTH);
2376 if (actual_status_length > 0)
2377 proto_tree_add_text(parameter_tree, parameter_tvb , RANGE_LENGTH, -1, "Status subfield");
2379 proto_tree_add_text(parameter_tree, parameter_tvb , 0, 0, "Status subfield is not present with this message type");
2382 proto_item_set_text(parameter_item, "Range (%u) and status", range);
2384 /* ------------------------------------------------------------------
2385 Dissector Parameter Circuit group supervision message type
2388 dissect_isup_circuit_group_supervision_message_type_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2390 guint8 cgs_message_type;
2392 cgs_message_type = tvb_get_guint8(parameter_tvb, 0);
2393 proto_tree_add_uint(parameter_tree, hf_isup_cgs_message_type, parameter_tvb, 0, CIRC_GRP_SV_MSG_TYPE_LENGTH, cgs_message_type);
2395 proto_item_set_text(parameter_item, "Circuit group supervision message type: %s (%u)" ,val_to_str(cgs_message_type, isup_cgs_message_type_value,"unknown"), cgs_message_type);
2397 /* ------------------------------------------------------------------
2398 Dissector Parameter Facility indicator parameter
2401 dissect_isup_facility_ind_parameter(tvbuff_t *parameter_tvb, proto_item *parameter_item)
2405 indicator = tvb_get_guint8(parameter_tvb, 0);
2407 proto_item_set_text(parameter_item, "Facility indicator: %s (%u)" ,val_to_str(indicator, isup_facility_ind_value,"spare"), indicator);
2409 /* ------------------------------------------------------------------
2410 Dissector Parameter Circuit state indicator
2413 dissect_isup_circuit_state_ind_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2415 proto_item *circuit_state_item;
2416 proto_tree *circuit_state_tree;
2417 guint8 circuit_state;
2422 while((length = tvb_reported_length_remaining(parameter_tvb, offset)) > 0){
2423 circuit_state_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2425 "Circuit# CIC+%u state", i);
2426 circuit_state_tree = proto_item_add_subtree(circuit_state_item, ett_isup_circuit_state_ind);
2427 circuit_state = tvb_get_guint8(parameter_tvb, offset);
2428 if ((circuit_state & DC_8BIT_MASK) == 0){
2429 proto_tree_add_uint(circuit_state_tree, hf_isup_mtc_blocking_state1, parameter_tvb, offset, 1, circuit_state);
2430 proto_item_set_text(circuit_state_item, "Circuit# CIC+%u state: %s", i++, val_to_str(circuit_state&BA_8BIT_MASK, isup_mtc_blocking_state_DC00_value, "unknown"));
2433 proto_tree_add_uint(circuit_state_tree, hf_isup_mtc_blocking_state2, parameter_tvb, offset, 1, circuit_state);
2434 proto_tree_add_uint(circuit_state_tree, hf_isup_call_proc_state, parameter_tvb, offset, 1, circuit_state);
2435 proto_tree_add_uint(circuit_state_tree, hf_isup_hw_blocking_state, parameter_tvb, offset, 1, circuit_state);
2436 proto_item_set_text(circuit_state_item, "Circuit# CIC+%u state: %s", i++, val_to_str(circuit_state&BA_8BIT_MASK, isup_mtc_blocking_state_DCnot00_value, "unknown"));
2440 proto_item_set_text(parameter_item, "Circuit state indicator (national use)");
2442 /* ------------------------------------------------------------------
2443 Dissector Parameter Event information
2446 dissect_isup_event_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2450 indicators = tvb_get_guint8(parameter_tvb, 0);
2451 proto_tree_add_uint_format(parameter_tree, hf_isup_event_ind, parameter_tvb, 0, EVENT_INFO_LENGTH, indicators, "Event indicator: %s (%u)", val_to_str(indicators & GFEDCBA_8BIT_MASK, isup_event_ind_value, "spare"), indicators & GFEDCBA_8BIT_MASK);
2452 proto_tree_add_boolean(parameter_tree, hf_isup_event_presentation_restricted_ind, parameter_tvb, 0, EVENT_INFO_LENGTH, indicators);
2454 proto_item_set_text(parameter_item,"Event information: %s (%u)", val_to_str(indicators & GFEDCBA_8BIT_MASK, isup_event_ind_value, "spare"),indicators );
2456 /* ------------------------------------------------------------------
2457 Dissector Parameter User-to-user information- no detailed dissection since defined in Rec. Q.931
2460 dissect_isup_user_to_user_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2461 { guint length = tvb_reported_length(parameter_tvb);
2462 proto_tree_add_text(parameter_tree, parameter_tvb, 0, -1,
2463 "User-to-user info (-> Q.931)");
2464 dissect_q931_user_user_ie(parameter_tvb, 0, length,
2466 proto_item_set_text(parameter_item, "User-to-user information,(%u byte%s length)",
2467 length , plurality(length, "", "s"));
2469 /* ------------------------------------------------------------------
2470 Dissector Parameter Call Reference
2473 dissect_isup_call_reference_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2478 call_id = tvb_get_ntoh24(parameter_tvb, 0);
2479 spc = tvb_get_letohs(parameter_tvb, CALL_ID_LENGTH) & 0x3FFF; /*since 1st 2 bits spare */
2480 proto_tree_add_text(parameter_tree, parameter_tvb, 0, CALL_ID_LENGTH, "Call identity: %u", call_id);
2481 proto_tree_add_text(parameter_tree, parameter_tvb, CALL_ID_LENGTH, SPC_LENGTH, "Signalling Point Code: %u", spc);
2483 proto_item_set_text(parameter_item, "Call Reference: Call ID = %u, SPC = %u", call_id, spc);
2485 /* ------------------------------------------------------------------
2486 Dissector Parameter Access Transport - no detailed dissection since defined in Rec. Q.931
2489 dissect_isup_access_transport_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree,
2490 proto_item *parameter_item, packet_info *pinfo)
2491 { guint length = tvb_reported_length(parameter_tvb);
2493 proto_tree_add_text(parameter_tree, parameter_tvb, 0, -1,
2494 "Access transport parameter field (-> Q.931)");
2497 call_dissector(q931_ie_handle, parameter_tvb, pinfo, parameter_tree);
2499 proto_item_set_text(parameter_item, "Access transport (%u byte%s length)",
2500 length , plurality(length, "", "s"));
2503 /* dissect x.213 NSAP coded Address */
2505 static const value_string x213_afi_value[] = {
2506 { 0x34, "IANA ICP"},
2507 { 0x35, "IANA ICP"},
2518 { 0x46, "ISO 6523-ICD"},
2519 { 0x47, "ISO 6523-ICD"},
2522 { 0x50, "Local ISO/IEC 646 character "},
2523 { 0x51, "Local ( National character )"},
2533 { 0x76, "ITU-T IND"},
2534 { 0x77, "ITU-T IND"},
2536 { 0xb8, "IANA ICP Group no"},
2537 { 0xb9, "IANA ICP Group no"},
2538 { 0xba, "X.121 Group no"},
2539 { 0xbb, "X.121 Group no"},
2540 { 0xbc, "ISO DCC Group no"},
2541 { 0xbd, "ISO DCC Group no"},
2542 { 0xbe, "F.69 Group no"},
2543 { 0xbf, "F.69 Group no"},
2544 { 0xc0, "E.163 Group no"},
2545 { 0xc1, "E.163 Group no"},
2546 { 0xc2, "E.164 Group no"},
2547 { 0xc3, "E.164 Group no"},
2548 { 0xc4, "ISO 6523-ICD Group no"},
2549 { 0xc5, "ISO 6523-ICD Group no"},
2550 { 0xc6, "Local Group no"},
2551 { 0xc7, "Local Group no"},
2552 { 0xc8, "Local ISO/IEC 646 character Group no"},
2553 { 0xc9, "Local ( National character ) Group no"},
2554 { 0xca, "X.121 Group no"},
2555 { 0xcb, "X.121 Group no"},
2556 { 0xcd, "F.69 Group no"},
2557 { 0xce, "F.69 Group no"},
2558 { 0xcf, "E.163 Group no"},
2559 { 0xde, "E.163 Group no"},
2560 { 0xd0, "E.164 Group no"},
2561 { 0xd1, "E.164 Group no"},
2563 { 0xe2, "ITU-T IND Group no"},
2564 { 0xe3, "ITU-T IND Group no"},
2569 /* Up-to-date information on the allocated ICP values can be found in */
2570 /*draft-gray-rfc1888bis-01 at */
2571 /*http://www.ietf.org/internet-drafts/draft-gray-rfc1888bis-01.txt */
2572 static const value_string iana_icp_values[] = {
2573 { 0x0, "IP Version 6 Address"},
2574 { 0x1, "IP Version 4 Address"},
2579 * XXX - shouldn't there be a centralized routine for dissecting NSAPs?
2580 * See also "dissect_atm_nsap()" in epan/dissectors/packet-arp.c and
2581 * "print_nsap_net_buf()" and "print_nsap_net()" in epan/osi_utils.c.
2584 dissect_nsap(tvbuff_t *parameter_tvb,gint offset,gint len, proto_tree *parameter_tree)
2588 guint icp, cc_offset;
2590 afi = tvb_get_guint8(parameter_tvb, offset);
2593 case 0x35: /* IANA ICP Binary fortmat*/
2594 proto_tree_add_text(parameter_tree, parameter_tvb, offset, 3,
2595 "IDP = %s", tvb_bytes_to_str(parameter_tvb, offset, 3));
2597 proto_tree_add_uint(parameter_tree, hf_afi, parameter_tvb, offset, 1, afi );
2598 offset = offset + 1;
2599 icp = tvb_get_ntohs(parameter_tvb, offset);
2600 proto_tree_add_uint(parameter_tree, hf_iana_icp, parameter_tvb, offset, 1, icp );
2601 if ( icp == 0 ){ /* IPv6 addr */
2602 proto_tree_add_text(parameter_tree, parameter_tvb, offset + 2 , 17,
2603 "DSP = %s", tvb_bytes_to_str(parameter_tvb, offset + 2, 17));
2604 proto_tree_add_item(parameter_tree, hf_nsap_ipv6_addr, parameter_tvb, offset + 2,
2608 else { /* IPv4 addr */
2609 /* XXX - this is really only for ICP 1 */
2610 proto_tree_add_text(parameter_tree, parameter_tvb, offset + 2, 17,
2611 "DSP = %s", tvb_bytes_to_str(parameter_tvb, offset + 2, 17));
2612 proto_tree_add_item(parameter_tree, hf_nsap_ipv4_addr, parameter_tvb, offset + 2, 4, FALSE);
2616 case 0x45: /* E.164 ATM format */
2617 case 0xC3: /* E.164 ATM group format */
2618 proto_tree_add_text(parameter_tree, parameter_tvb, offset, 9,
2619 "IDP = %s", tvb_bytes_to_str(parameter_tvb, offset, 9));
2621 proto_tree_add_uint(parameter_tree, hf_afi, parameter_tvb, offset, 1, afi );
2623 proto_tree_add_text(parameter_tree, parameter_tvb, offset + 1, 8,
2624 "IDI = %s", tvb_bytes_to_str(parameter_tvb, offset + 1, 8));
2626 /* Dissect country code */
2628 dissect_e164_cc(parameter_tvb, parameter_tree, 3, TRUE);
2630 proto_tree_add_text(parameter_tree,parameter_tvb, cc_offset, length,"DSP length %u(len %u -9 )",(len-9),len );
2632 proto_tree_add_item(parameter_tree, hf_bicc_nsap_dsp, parameter_tvb, offset + 8, (len - 9),FALSE);
2636 proto_tree_add_uint(parameter_tree, hf_afi, parameter_tvb, offset, len, afi );
2637 }/* end switch afi */
2642 #define ACTION_INDICATOR 0x01
2643 #define BACKBONE_NETWORK_CONNECTION_IDENTIFIER 0x02
2644 #define INTERWORKING_FUNCTION_ADDRESS 0x03
2645 #define CODEC_LIST 0x04
2647 #define BAT_COMPATIBILITY_REPORT 0x06
2648 #define BEARER_NETWORK_CONNECTION_CHARACTERISTICS 0x07
2649 #define BEARER_CONTROL_INFORMATION 0x08
2650 #define BEARER_CONTROL_TUNNELLING 0x09
2651 #define BEARER_CONTROL_UNIT_IDENTIFIER 0x0A
2653 #define BEARER_REDIRECTION_CAPABILITY 0x0C
2654 #define BEARER_REDIRECTION_INDICATORS 0x0D
2655 #define SIGNAL_TYPE 0x0E
2656 #define DURATION 0x0F
2659 static const value_string bat_ase_list_of_Identifiers_vals[] = {
2662 { ACTION_INDICATOR , "Action Indicator" },
2663 { BACKBONE_NETWORK_CONNECTION_IDENTIFIER , "Backbone Network Connection Identifier" },
2664 { INTERWORKING_FUNCTION_ADDRESS , "Interworking Function Address" },
2665 { CODEC_LIST , "Codec List" },
2666 { CODEC , "Codec" },
2667 { BAT_COMPATIBILITY_REPORT , "BAT Compatibility Report" },
2668 { BEARER_NETWORK_CONNECTION_CHARACTERISTICS , "Bearer Network Connection Characteristics" },
2669 { BEARER_CONTROL_INFORMATION , "Bearer Control Information"},
2670 { BEARER_CONTROL_TUNNELLING , "Bearer Control Tunnelling"},
2671 { BEARER_CONTROL_UNIT_IDENTIFIER , "Bearer Control Unit Identifier" },
2672 { SIGNAL , "Signal"},
2673 { BEARER_REDIRECTION_CAPABILITY , "Bearer Redirection Capability"},
2674 { BEARER_REDIRECTION_INDICATORS , "Bearer Redirection Indicators"},
2675 { SIGNAL_TYPE , "Signal Type"},
2676 { DURATION , "Duration" },
2680 /*ITU-T Q.765.5 (06/2000) 13*/
2681 static const value_string Instruction_indicator_for_general_action_vals[] =
2683 { 0, "Pass on information element"},
2684 { 1, "Discard information element"},
2685 { 2, "Discard BICC data"},
2686 { 3, "Release call"},
2689 static const value_string Instruction_indicator_for_pass_on_not_possible_vals[] = {
2690 { 0, "Release call"},
2691 { 1, "Discard information element"},
2692 { 2, "Discard BICC data"},
2693 { 3, "reserved (interpreted as 00)"},
2696 static const value_string bat_ase_action_indicator_field_vals[] = {
2698 { 0x00, "no indication"},
2699 { 0x01, "connect backward"},
2700 { 0x02, "connect forward"},
2701 { 0x03, "connect forward, no notification"},
2702 { 0x04, "connect forward, plus notification"},
2703 { 0x05, "connect forward, no notification + selected codec"},
2704 { 0x06, "connect forward, plus notification + selected codec"},
2705 { 0x07, "use idle"},
2706 { 0x08, "connected"},
2707 { 0x09, "switched"},
2708 { 0x0a, "selected codec"},
2709 { 0x0b, "modify codec"},
2710 { 0x0c, "successful codec modification"},
2711 { 0x0d, "codec modification failure"},
2712 { 0x0e, "mid-call codec negotiation"},
2713 { 0x0f, "modify to selected codec information"},
2714 { 0x10, "mid-call codec negotiation failure"},
2715 { 0x11, "start signal, notify"},
2716 { 0x12, "start signal, no notify"},
2717 { 0x13, "stop signal, notify"},
2718 { 0x14, "stop signal, no notify"},
2719 { 0x15, "start signal acknowledge"},
2720 { 0x16, "start signal reject"},
2721 { 0x17, "stop signal acknowledge"},
2722 { 0x18, "bearer redirect"},
2726 static const true_false_string BCTP_BVEI_value = {
2727 "Version Error Indication, BCTP version not supported",
2731 static const value_string BCTP_Tunnelled_Protocol_Indicator_vals[] = {
2733 { 0x20, "IPBCP (text encoded)"},
2734 { 0x21, "spare (text encoded protocol)"},
2735 { 0x22, "not used"},
2739 static const true_false_string BCTP_TPEI_value = {
2740 "Protocol Error Indication, Bearer Control Protocol not supported",
2748 static const value_string bat_ase_organization_identifier_subfield_vals[] = {
2750 { 0x00, "no indication"},
2752 { 0x02, "ETSI (refer to TS 26.103)"},
2756 #define G_711_64_A 0x01
2757 #define G_711_64_U 0x02
2758 #define G_711_56_A 0x03
2759 #define G_711_56_U 0x04
2760 #define G_722_SB_ADPCM 0x05
2761 #define G_723_1 0x06
2762 #define G_723_1_Annex_A 0x07
2763 #define G_726_ADPCM 0x08
2764 #define G_727_Embedded_ADPCM 0x09
2766 #define G_729_CS_ACELP 0x0b
2767 #define G_729_Annex_B 0x0c
2769 static const value_string ITU_T_codec_type_subfield_vals[] = {
2771 { 0x00, "no indication"},
2772 { G_711_64_A, "G.711 64 kbit/s A-law"},
2773 { G_711_64_U, "G.711 64 kbit/s -law"},
2774 { G_711_56_A, "G.711 56 kbit/s A-law"},
2775 { G_711_56_U, "G.711 56 kbit/s -law"},
2776 { G_722_SB_ADPCM, "G.722 (SB-ADPCM)"},
2777 { G_723_1, "G.723.1"},
2778 { G_723_1_Annex_A, "G.723.1 Annex A (silence suppression)"},
2779 { G_726_ADPCM, "G.726 (ADPCM)"},
2780 { G_727_Embedded_ADPCM, "G.727 (Embedded ADPCM)"},
2782 { G_729_CS_ACELP, "G.729 (CS-ACELP)"},
2783 { G_729_Annex_B, "G.729 Annex B (silence suppression)"},
2787 static const value_string ETSI_codec_type_subfield_vals[] = {
2789 { 0x00, "GSM Full Rate (13.0 kBit/s)( GSM FR )"},
2790 { 0x01, "GSM Half Rate (5.6 kBit/s) ( GSM HR )"},
2791 { 0x02, "GSM Enhanced Full Rate (12.2 kBit/s)( GSM EFR )"},
2792 { 0x03, "Full Rate Adaptive Multi-Rate ( FR AMR )"},
2793 { 0x04, "Half Rate Adaptive Multi-Rate ( HR AMR )"},
2794 { 0x05, "UMTS Adaptive Multi-Rate ( UMTS AMR )"},
2795 { 0x06, "UMTS Adaptive Multi-Rate 2 ( UMTS AMR 2 )"},
2796 { 0x07, "TDMA Enhanced Full Rate (7.4 kBit/s) ( TDMA EFR )"},
2797 { 0x08, "PDC Enhanced Full Rate (6.7 kBit/s) ( PDC EFR )"},
2798 { 0x09, "Full Rate Adaptive Multi-Rate WideBand ( FR AMR-WB )"},
2799 { 0x0a, "UMTS Adaptive Multi-Rate WideBand ( UMTS AMR-WB )"},
2800 { 0x0b, "8PSK Half Rate Adaptive Multi-Rate ( OHR AMR )"},
2801 { 0x0c, "8PSK Full Rate Adaptive Multi-Rate WideBand ( OFR AMR-WB )"},
2802 { 0x0d, "8PSK Half Rate Adaptive Multi-Rate WideBand ( OHR AMR-WB )"},
2803 { 0xfe, "Reserved for future use."},
2804 { 0xff, "Reserved for MuMe dummy Codec Type ( MuMe )"},
2808 static const value_string bat_initial_codec_mode_vals[] = {
2820 static const value_string optimisation_mode_vals[] = {
2821 { 0, "Optimisation of the ACS not supported,"},
2822 { 1, "Optimisation of the ACS supported,"},
2826 const value_string bearer_network_connection_characteristics_vals[] = {
2828 { 0x00, "no indication"},
2829 { 0x01, "AAL type 1"},
2830 { 0x02, "AAL type 2"},
2831 { 0x03, "Structured AAL type 1"},
2833 { 0x05, "TDM (reserved for use by ITU-T Rec. Q.1950)"},
2837 static const true_false_string Bearer_Control_Tunnelling_ind_value = {
2838 "Tunnelling to be used",
2842 static const true_false_string late_cut_trough_cap_ind_value = {
2843 "Late Cut-through supported",
2844 "Late Cut-through not supported"
2846 /* ITU-T Rec. Q.765.5/Amd.1 (07/2001) */
2847 static const value_string Bearer_Redirection_Indicator_vals[] = {
2848 { 0x00, " no indication"},
2849 { 0x01, "late cut-through request"},
2850 { 0x02, "redirect temporary reject"},
2851 { 0x03, "redirect backwards request"},
2852 { 0x04, "redirect forwards request"},
2853 { 0x05, "redirect bearer release request"},
2854 { 0x06, "redirect bearer release proceed"},
2855 { 0x07, "redirect bearer release complete"},
2856 { 0x08, "redirect cut-through request"},
2857 { 0x09, "redirect bearer connected indication"},
2858 { 0x0a, "redirect failure"},
2859 { 0x0b, "new connection identifier"},
2863 /*26/Q.765.5 - Signal Type */
2864 static const value_string BAt_ASE_Signal_Type_vals[] = {
2881 { 0x40, "dial tone"},
2882 { 0x41, "PABX internal dial tone"},
2883 { 0x42, "special dial tone"},
2884 { 0x43, "second dial tone"},
2885 { 0x44, "ringing tone"},
2886 { 0x45, "special ringing tone"},
2887 { 0x46, "busy tone"},
2888 { 0x47, "congestion tone"},
2889 { 0x48, "special information tone"},
2890 { 0x49, "warning tone"},
2891 { 0x4a, "intrusion tone"},
2892 { 0x4b, "call waiting tone"},
2893 { 0x4c, "pay tone"},
2894 { 0x4d, "payphone recognition tone"},
2895 { 0x4e, "comfort tone"},
2896 { 0x4f, "tone on hold"},
2897 { 0x50, "record tone"},
2898 { 0x51, "Caller waiting tone"},
2899 { 0x52, "positive indication tone"},
2900 { 0x53, "negative indication tone"},
2904 static const value_string BAT_ASE_Report_Reason_vals[] = {
2906 { 0x00, "no indication"},
2907 { 0x01, "information element non-existent or not implemented"},
2908 { 0x02, "BICC data with unrecognized information element, discarded"},
2911 /* This routine should bve called with offset at Organization_Identifier not the lengh indicator
2912 * because of use from other disectors.
2914 extern int dissect_codec_mode(proto_tree *tree, tvbuff_t *tvb, int offset, int len) {
2916 proto_tree *scs_item, *acs_item;
2917 proto_tree *scs_tree, *acs_tree;
2920 tempdata = tvb_get_guint8(tvb, offset);
2921 proto_tree_add_uint(tree, hf_Organization_Identifier , tvb, offset, 1, tempdata );
2922 switch ( tempdata ){
2924 offset = offset + 1;
2925 tempdata = tvb_get_guint8(tvb, offset);
2926 proto_tree_add_uint(tree, hf_codec_type , tvb, offset, 1, tempdata );
2927 offset = offset + 1;
2928 switch ( tempdata ) {
2933 case G_722_SB_ADPCM :
2935 case G_723_1_Annex_A :
2936 /* These codecs have no configuration data */
2939 case G_727_Embedded_ADPCM :
2940 /* four bit config data, TODO decode config */
2942 tempdata = tvb_get_guint8(tvb, offset);
2943 proto_tree_add_text(tree, tvb, offset, 1, "Configuration data : 0x%x", tempdata);
2944 offset = offset + 1;
2948 case G_729_CS_ACELP :
2949 case G_729_Annex_B :
2950 /* three bit config data, TODO decode config */
2952 tempdata = tvb_get_guint8(tvb, offset);
2953 proto_tree_add_text(tree, tvb, offset, 1 , "Configuration data : 0x%x", tempdata);
2954 offset = offset + 1;
2963 offset = offset + 1;
2964 tempdata = tvb_get_guint8(tvb, offset);
2965 proto_tree_add_uint(tree, hf_etsi_codec_type , tvb, offset, 1, tempdata );
2967 offset = offset + 1;
2968 tempdata = tvb_get_guint8(tvb, offset);
2970 acs_item = proto_tree_add_item(tree, hf_active_code_set, tvb, offset, 1, TRUE);
2971 acs_tree = proto_item_add_subtree(acs_item,ett_acs);
2972 proto_tree_add_item(acs_tree, hf_active_code_set_12_2, tvb, offset, 1, TRUE);
2973 proto_tree_add_item(acs_tree, hf_active_code_set_10_2, tvb, offset, 1, TRUE);
2974 proto_tree_add_item(acs_tree, hf_active_code_set_7_95, tvb, offset, 1, TRUE);
2975 proto_tree_add_item(acs_tree, hf_active_code_set_7_40, tvb, offset, 1, TRUE);
2976 proto_tree_add_item(acs_tree, hf_active_code_set_6_70, tvb, offset, 1, TRUE);
2977 proto_tree_add_item(acs_tree, hf_active_code_set_5_90, tvb, offset, 1, TRUE);
2978 proto_tree_add_item(acs_tree, hf_active_code_set_5_15, tvb, offset, 1, TRUE);
2979 proto_tree_add_item(acs_tree, hf_active_code_set_4_75, tvb, offset, 1, TRUE);
2983 offset = offset + 1;
2984 tempdata = tvb_get_guint8(tvb, offset);
2986 scs_item = proto_tree_add_item(tree, hf_supported_code_set, tvb, offset, 1, TRUE);
2987 scs_tree = proto_item_add_subtree(scs_item,ett_scs);
2988 proto_tree_add_item(scs_tree, hf_supported_code_set_12_2, tvb, offset, 1, TRUE);
2989 proto_tree_add_item(scs_tree, hf_supported_code_set_10_2, tvb, offset, 1, TRUE);
2990 proto_tree_add_item(scs_tree, hf_supported_code_set_7_95, tvb, offset, 1, TRUE);
2991 proto_tree_add_item(scs_tree, hf_supported_code_set_7_40, tvb, offset, 1, TRUE);
2992 proto_tree_add_item(scs_tree, hf_supported_code_set_6_70, tvb, offset, 1, TRUE);
2993 proto_tree_add_item(scs_tree, hf_supported_code_set_5_90, tvb, offset, 1, TRUE);
2994 proto_tree_add_item(scs_tree, hf_supported_code_set_5_15, tvb, offset, 1, TRUE);
2995 proto_tree_add_item(scs_tree, hf_supported_code_set_4_75, tvb, offset, 1, TRUE);
2998 offset = offset + 1;
2999 proto_tree_add_item(tree, hf_optimisation_mode, tvb, offset, 1, TRUE);
3000 proto_tree_add_item(tree, hf_max_codec_modes, tvb, offset, 1, TRUE);
3002 offset = offset + 1;
3005 offset = offset + 1;
3006 tempdata = tvb_get_guint8(tvb, offset);
3007 proto_tree_add_text(tree, tvb, offset, len ,
3008 "Unknown organisation Identifier ( Non ITU-T/ETSI codec ) %u", tempdata);
3009 offset = offset + len - 1;
3018 dissect_codec(tvbuff_t *parameter_tvb, proto_tree *bat_ase_element_tree, gint length_indicator, gint offset,gint identifier)
3020 /* offset is at length indicator e.g 1 step past identifier */
3021 guint8 compatibility_info;
3023 proto_tree_add_uint(bat_ase_element_tree , hf_bat_ase_identifier , parameter_tvb, offset - 1, 1, identifier );
3024 proto_tree_add_uint(bat_ase_element_tree , hf_length_indicator , parameter_tvb, offset, 1, length_indicator );
3025 offset = offset + 1;
3026 compatibility_info = tvb_get_guint8(parameter_tvb, offset);
3027 proto_tree_add_uint(bat_ase_element_tree, hf_Instruction_ind_for_general_action , parameter_tvb, offset, 1, compatibility_info );
3028 proto_tree_add_boolean(bat_ase_element_tree, hf_Send_notification_ind_for_general_action , parameter_tvb, offset, 1, compatibility_info );
3029 proto_tree_add_uint(bat_ase_element_tree, hf_Instruction_ind_for_pass_on_not_possible , parameter_tvb, offset, 1, compatibility_info );
3030 proto_tree_add_boolean(bat_ase_element_tree, hf_Send_notification_ind_for_pass_on_not_possible , parameter_tvb, offset, 1, compatibility_info );
3031 proto_tree_add_boolean(bat_ase_element_tree, hf_isup_extension_ind , parameter_tvb, offset, 1, compatibility_info );
3033 offset = dissect_codec_mode(bat_ase_element_tree, parameter_tvb, offset+1,length_indicator-1);
3037 /* Dissect BAT ASE message according to Q.765.5 200006 and Amendment 1 200107
3038 * Layout of message Length Octet
3041 * Length indicator 1 2
3042 * Compatibility information 1 3
3045 * Length indicator n
3046 * Compatibility information n
3051 dissect_bat_ase_Encapsulated_Application_Information(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, gint offset)
3053 gint length = tvb_reported_length_remaining(parameter_tvb, offset), list_end;
3055 proto_tree *bat_ase_tree, *bat_ase_element_tree, *bat_ase_iwfa_tree;
3056 proto_item *bat_ase_item, *bat_ase_element_item, *bat_ase_iwfa_item;
3057 guint8 identifier,content, BCTP_Indicator_field_1, BCTP_Indicator_field_2;
3058 guint8 tempdata, element_no, number_of_indicators;
3060 guint8 diagnostic_len;
3061 guint8 length_ind_len;
3063 guint content_len, length_indicator;
3066 guint32 bncid, Local_BCU_ID;
3069 bat_ase_item = proto_tree_add_text(parameter_tree,parameter_tvb, offset, -1,
3070 "Bearer Association Transport (BAT) Application Service Element (ASE) Encapsulated Application Information:");
3071 bat_ase_tree = proto_item_add_subtree(bat_ase_item , ett_bat_ase);
3073 proto_tree_add_text(bat_ase_tree, parameter_tvb, offset, -1,
3074 "BAT ASE Encapsulated Application Information, (%u byte%s length)", length, plurality(length, "", "s"));
3075 while(tvb_reported_length_remaining(parameter_tvb, offset) > 0){
3076 element_no = element_no + 1;
3077 identifier = tvb_get_guint8(parameter_tvb, offset);
3079 /* length indicator may be 11 bits long */
3080 offset = offset + 1;
3081 proto_tree_add_item( bat_ase_tree, hf_isup_extension_ind, parameter_tvb, offset, 1, FALSE );
3082 tempdata = tvb_get_guint8(parameter_tvb, offset);
3083 if ( tempdata & 0x80 ) {
3084 length_indicator = tempdata & 0x7f;
3088 offset = offset + 1;
3089 tempdata16 = ( tempdata & 0x7f );
3090 length_indicator = tvb_get_guint8(parameter_tvb, offset)& 0x0f;
3091 length_indicator = length_indicator << 7;
3092 length_indicator = length_indicator + tempdata16;
3096 bat_ase_element_item = proto_tree_add_text(bat_ase_tree,parameter_tvb,
3097 ( offset - length_ind_len),(length_indicator + 2),"BAT ASE Element %u, Identifier: %s",element_no,
3098 val_to_str(identifier,bat_ase_list_of_Identifiers_vals,"unknown (%u)"));
3099 bat_ase_element_tree = proto_item_add_subtree(bat_ase_element_item ,
3100 ett_bat_ase_element);
3101 if ( identifier != CODEC ) {
3102 /* identifier, length indicator and compabillity info must be printed inside CODEC */
3103 /* dissection in order to use dissect_codec routine for codec list */
3104 proto_tree_add_uint(bat_ase_element_tree , hf_bat_ase_identifier , parameter_tvb,
3105 offset - length_ind_len, 1, identifier );
3106 proto_tree_add_uint(bat_ase_element_tree , hf_length_indicator , parameter_tvb,
3107 offset - length_ind_len + 1, length_ind_len, length_indicator );
3109 offset = offset + 1;
3110 proto_tree_add_item( bat_ase_element_tree, hf_isup_extension_ind, parameter_tvb, offset, 1, FALSE );
3111 proto_tree_add_item( bat_ase_element_tree, hf_Send_notification_ind_for_pass_on_not_possible, parameter_tvb, offset, 1, FALSE );
3112 proto_tree_add_item( bat_ase_element_tree, hf_Instruction_ind_for_pass_on_not_possible, parameter_tvb, offset, 1, FALSE );
3113 proto_tree_add_item( bat_ase_element_tree, hf_Send_notification_ind_for_general_action, parameter_tvb, offset, 1, FALSE );
3114 proto_tree_add_item( bat_ase_element_tree, hf_Instruction_ind_for_general_action, parameter_tvb, offset, 1, FALSE );
3115 offset = offset + 1;
3117 content_len = length_indicator - 1 ; /* exclude the treated Compatibility information */
3119 /* content will be different depending on identifier */
3120 switch ( identifier ){
3122 case ACTION_INDICATOR :
3124 content = tvb_get_guint8(parameter_tvb, offset);
3125 proto_tree_add_uint(bat_ase_element_tree, hf_Action_Indicator , parameter_tvb, offset, 1, content );
3126 proto_item_append_text(bat_ase_element_item, " - %s",
3127 val_to_str(content,bat_ase_action_indicator_field_vals, "unknown (%u)"));
3128 offset = offset + 1;
3130 case BACKBONE_NETWORK_CONNECTION_IDENTIFIER :
3132 bncid = tvb_get_ntohl(parameter_tvb, offset);
3133 switch ( content_len ){
3135 bncid = bncid & 0x000000ff;
3138 bncid = bncid & 0x0000ffff;
3141 bncid = bncid & 0x00ffffff;
3146 proto_tree_add_uint_format(bat_ase_element_tree, hf_bncid, parameter_tvb, offset, content_len, bncid, "BNCId: 0x%08x", bncid);
3147 proto_item_append_text(bat_ase_element_item, " - 0x%08x",bncid);
3148 offset = offset + content_len;
3151 case INTERWORKING_FUNCTION_ADDRESS :
3152 bat_ase_iwfa_item = proto_tree_add_item(bat_ase_element_tree, hf_bat_ase_biwfa, parameter_tvb, offset, content_len,
3154 bat_ase_iwfa_tree = proto_item_add_subtree(bat_ase_iwfa_item , ett_bat_ase_iwfa);
3155 dissect_nsap(parameter_tvb, offset, content_len, bat_ase_iwfa_tree);
3157 offset = offset + content_len;
3160 list_end = offset + content_len;
3161 while ( offset < ( list_end - 1 )) {
3162 identifier = tvb_get_guint8(parameter_tvb, offset);
3163 offset = offset + 1;
3164 tempdata = tvb_get_guint8(parameter_tvb, offset);
3165 if ( tempdata & 0x80 ) {
3166 length_indicator = tempdata & 0x7f;
3170 length_indicator = tvb_get_guint8(parameter_tvb, offset);
3171 length_indicator = length_indicator << 7;
3172 length_indicator = length_indicator & ( tempdata & 0x7f );
3174 offset = dissect_codec(parameter_tvb, bat_ase_element_tree, length_indicator , offset, identifier);
3178 /* offset is at length indicator in this case */
3179 offset = dissect_codec(parameter_tvb, bat_ase_element_tree, length_indicator , offset, identifier);
3180 break;/* case codec */
3181 case BAT_COMPATIBILITY_REPORT :
3182 tempdata = tvb_get_guint8(parameter_tvb, offset);
3183 proto_tree_add_uint(bat_ase_element_tree, hf_BAT_ASE_Comp_Report_Reason, parameter_tvb, offset, 1, tempdata );
3184 offset = offset + 1;
3186 diagnostic_len = content_len - 1;
3187 while ( diagnostic_len > 0 ) {
3188 tempdata = tvb_get_guint8(parameter_tvb, offset);
3189 proto_tree_add_uint(bat_ase_element_tree, hf_BAT_ASE_Comp_Report_ident, parameter_tvb, offset, 1, tempdata );
3190 offset = offset + 1;
3191 diagnostic = tvb_get_letohs(parameter_tvb, offset);
3192 proto_tree_add_uint(bat_ase_element_tree, hf_BAT_ASE_Comp_Report_diagnostic, parameter_tvb, offset, 2, diagnostic);
3193 offset = offset + 2;
3194 diagnostic_len = diagnostic_len - 3;
3197 case BEARER_NETWORK_CONNECTION_CHARACTERISTICS :
3198 tempdata = tvb_get_guint8(parameter_tvb, offset);
3199 proto_tree_add_uint(bat_ase_element_tree, hf_characteristics , parameter_tvb,
3200 offset, 1, tempdata );
3201 proto_item_append_text(bat_ase_element_item, " - %s",
3202 val_to_str(tempdata,bearer_network_connection_characteristics_vals, "unknown (%u)"));
3204 offset = offset + content_len;
3206 /* The Bearer Control Information information element contains the bearer control tunnelling protocol */
3207 /* ITU-T Q.1990 (2001), BICC bearer control tunnelling protocol. */
3209 case BEARER_CONTROL_INFORMATION :
3210 BCTP_Indicator_field_1 = tvb_get_guint8(parameter_tvb, offset);
3211 proto_tree_add_uint(bat_ase_element_tree, hf_BCTP_Version_Indicator,
3212 parameter_tvb, offset, 1, BCTP_Indicator_field_1 );
3214 proto_tree_add_boolean(bat_ase_element_tree, hf_BVEI,
3215 parameter_tvb, offset, 1, BCTP_Indicator_field_1 );
3216 offset = offset + 1;
3218 BCTP_Indicator_field_2 = tvb_get_guint8(parameter_tvb, offset);
3220 proto_tree_add_uint(bat_ase_element_tree, hf_Tunnelled_Protocol_Indicator ,
3221 parameter_tvb, offset, 1, BCTP_Indicator_field_2 );
3223 proto_tree_add_boolean(bat_ase_element_tree, hf_TPEI,
3224 parameter_tvb, offset, 1, BCTP_Indicator_field_2 );
3225 offset = offset + 1;
3227 sdp_length = ( length_indicator ) - 3;
3229 if(sdp_length > tvb_length_remaining(parameter_tvb,offset)){
3230 /* If this is a segmented message we may not have all the data */
3231 next_tvb = tvb_new_subset(parameter_tvb, offset, -1, -1);
3233 next_tvb = tvb_new_subset(parameter_tvb, offset, sdp_length, sdp_length);
3235 call_dissector(sdp_handle, next_tvb, pinfo, bat_ase_element_tree);
3236 offset = offset + sdp_length;
3240 case BEARER_CONTROL_TUNNELLING :
3242 tempdata = tvb_get_guint8(parameter_tvb, offset);
3243 proto_tree_add_boolean(bat_ase_element_tree, hf_bearer_control_tunneling , parameter_tvb, offset, 1, ( tempdata & 0x01 ) );
3244 if ( tempdata & 0x01 )
3245 proto_item_append_text(bat_ase_element_item, " - Tunnelling to be used ");
3247 offset = offset + content_len;
3249 case BEARER_CONTROL_UNIT_IDENTIFIER :
3250 tempdata = tvb_get_guint8(parameter_tvb, offset);
3251 proto_tree_add_text(bat_ase_element_tree, parameter_tvb, offset, 1, "Network ID Length indicator= %u",tempdata);
3253 if ( tempdata > 0 ) {
3258 The coding of the Network ID field is identical to the coding of the Network ID field in the
3259 Global Call Reference parameter as specified in clause 6/Q.1902.3 (see [3]).
3260 NOTE .When used inside a network domain, the Network ID may be omitted by setting the
3261 Network ID Length indicator to the value "0".
3263 The following codes are used in the subfields of the global call reference parameter field:
3265 The Network ID contains the value field (coded according to ASN.1 BER) of an object
3266 identifier identifying the network. This means that the tag and length fields are omitted.
3267 An example of such an object identifier can be the following:
3268 .{itu-t (0) administration (2) national regulatory authority (x) network (y)}
3269 The value for x is the value of the national regulatory authority (one of the Data Country
3270 Codes associated to the country as specified in ITU-T X.121 shall be used for "national
3271 regulatory authority"), the value for y is under the control of the national regulatory
3272 authority concerned.
3274 A binary number that uniquely identifies within the network the node which generates the
3276 c) Call Reference ID
3277 A binary number used for the call reference of the call. This is generated by the node for
3281 proto_tree_add_text(bat_ase_element_tree, parameter_tvb, offset, tempdata , "Network ID: %s",
3282 tvb_bytes_to_str(parameter_tvb, offset, tempdata));
3283 offset = offset + tempdata;
3286 Local_BCU_ID = tvb_get_letohl(parameter_tvb, offset);
3287 proto_tree_add_uint_format(bat_ase_element_tree, hf_Local_BCU_ID , parameter_tvb, offset, 4, Local_BCU_ID , "Local BCU ID : 0x%08x", Local_BCU_ID );
3288 offset = offset + 4;
3291 /* As type is Constructor new elements follow, return to main loop */
3293 case BEARER_REDIRECTION_CAPABILITY :
3294 tempdata = tvb_get_guint8(parameter_tvb, offset);
3295 proto_tree_add_boolean(bat_ase_element_tree, hf_late_cut_trough_cap_ind , parameter_tvb, offset, 1, tempdata );
3296 offset = offset + content_len;
3298 case BEARER_REDIRECTION_INDICATORS :
3299 number_of_indicators = 0;
3300 while ( number_of_indicators < content_len ) {
3301 tempdata = tvb_get_guint8(parameter_tvb, offset);
3302 proto_tree_add_uint(bat_ase_element_tree, hf_bat_ase_bearer_redir_ind , parameter_tvb, offset, 1, tempdata );
3303 offset = offset + 1;
3304 number_of_indicators = number_of_indicators + 1;
3308 tempdata = tvb_get_guint8(parameter_tvb, offset);
3309 proto_tree_add_uint(bat_ase_element_tree, hf_bat_ase_signal , parameter_tvb, offset, 1, tempdata );
3310 offset = offset + content_len;
3313 duration = tvb_get_letohs(parameter_tvb, offset);
3314 proto_tree_add_uint(bat_ase_element_tree, hf_bat_ase_duration , parameter_tvb, offset, 2, duration );
3315 offset = offset + content_len;
3318 proto_tree_add_text(bat_ase_element_tree, parameter_tvb, offset,content_len , "Default ?, (%u byte%s length)", (content_len), plurality(content_len, "", "s"));
3319 offset = offset + content_len;
3329 -------------------------------------------
3330 1 | ext. Application context identifier lsb
3331 -------------------------------------------
3333 -------------------------------------------
3334 2 | ext. spare SNI RCI
3335 -------------------------------------------
3336 3 | ext. SI APM segmentation indicator
3337 -------------------------------------------
3338 3a | ext. Segmentation local reference
3339 -------------------------------------------
3341 : | APM-user information
3343 +-------------------------------------------
3345 Figure 77/Q.763 . Application transport parameter field
3348 dissect_isup_application_transport_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item)
3351 guint8 application_transport_instruction_ind;
3352 guint8 si_and_apm_seg_ind;
3353 guint8 apm_Segmentation_local_ref = 0;
3357 guint length = tvb_reported_length(parameter_tvb);
3360 gboolean save_fragmented;
3361 tvbuff_t* new_tvb = NULL;
3362 tvbuff_t* next_tvb = NULL;
3363 fragment_data *frag_msg = NULL;
3365 proto_tree_add_text(parameter_tree, parameter_tvb, offset, -1, "Application transport parameter fields:");
3366 proto_item_set_text(parameter_item, "Application transport, (%u byte%s length)", length , plurality(length, "", "s"));
3367 aci16 = tvb_get_guint8(parameter_tvb, offset);
3369 if ( (aci16 & H_8BIT_MASK) == 0x80) {
3371 aci16 = aci16 & 0x7f;
3372 proto_tree_add_item( parameter_tree, hf_isup_extension_ind, parameter_tvb, offset, 1, FALSE );
3373 proto_tree_add_uint(parameter_tree, hf_isup_app_cont_ident , parameter_tvb, offset, 1, aci16);
3374 offset = offset + 1;
3378 aci16 = (aci16<<8) | (tvb_get_guint8(parameter_tvb, offset) & 0x7f);
3379 proto_tree_add_uint(parameter_tree, hf_isup_app_cont_ident , parameter_tvb, offset, 2, aci16);
3380 offset = offset + 2;
3384 proto_tree_add_text(parameter_tree, parameter_tvb, offset, -1, "Application transport instruction indicators: ");
3385 application_transport_instruction_ind = tvb_get_guint8(parameter_tvb, offset);
3386 proto_tree_add_item( parameter_tree, hf_isup_extension_ind, parameter_tvb, offset, 1, FALSE );
3387 proto_tree_add_item( parameter_tree, hf_isup_app_Send_notification_ind, parameter_tvb, offset, 1, FALSE );
3388 proto_tree_add_item( parameter_tree, hf_isup_app_Release_call_ind, parameter_tvb, offset, 1, FALSE );
3389 offset = offset + 1;
3392 proto_tree_add_text(parameter_tree, parameter_tvb, offset, 1, "APM segmentation indicator:");
3393 si_and_apm_seg_ind = tvb_get_guint8(parameter_tvb, offset);
3394 proto_tree_add_item( parameter_tree, hf_isup_extension_ind, parameter_tvb, offset, 1, FALSE );
3395 proto_tree_add_item( parameter_tree, hf_isup_apm_si_ind, parameter_tvb, offset, 1, FALSE );
3396 proto_tree_add_item( parameter_tree, hf_isup_apm_segmentation_ind, parameter_tvb, offset, 1, FALSE );
3397 offset = offset + 1;
3400 if ( (si_and_apm_seg_ind & H_8BIT_MASK) == 0x00) {
3401 apm_Segmentation_local_ref = tvb_get_guint8(parameter_tvb, offset);
3402 proto_tree_add_item( parameter_tree, hf_isup_extension_ind, parameter_tvb, offset, 1, FALSE );
3403 proto_tree_add_item( parameter_tree, hf_isup_apm_slr, parameter_tvb, offset, 1, FALSE );
3404 offset = offset + 1;
3406 /* For APM'98'-user applications. ( aci 0 - 3 ), APM-user information field starts at octet 4 */
3408 /* Octet 4 Originating Address length */
3409 octet = tvb_get_guint8(parameter_tvb,offset);
3410 proto_tree_add_item( parameter_tree, hf_isup_orig_addr_len, parameter_tvb, offset, 1, FALSE );
3414 proto_tree_add_item( parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, offset, 1, FALSE );
3415 /* nature of address indicator */
3417 proto_tree_add_item( parameter_tree, hf_isup_inn_indicator, parameter_tvb, offset, 1, FALSE );
3418 proto_tree_add_item( parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, offset, 1, FALSE );
3420 /* Address digits */
3421 proto_tree_add_text(parameter_tree, parameter_tvb, offset, octet - 2, "Address digits");
3422 offset = offset + octet - 2;
3424 /* Octet 5 Destination Address length */
3425 octet = tvb_get_guint8(parameter_tvb,offset);
3426 proto_tree_add_item( parameter_tree, hf_isup_dest_addr_len, parameter_tvb, offset, 1, FALSE );
3430 proto_tree_add_item( parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, offset, 1, FALSE );
3431 /* nature of address indicator */
3433 proto_tree_add_item( parameter_tree, hf_isup_inn_indicator, parameter_tvb, offset, 1, FALSE );
3434 proto_tree_add_item( parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, offset, 1, FALSE );
3436 /* Address digits */
3437 proto_tree_add_text(parameter_tree, parameter_tvb, offset, octet - 2, "Address digits");
3438 offset = offset + octet - 2;
3445 if (isup_apm_desegment){
3446 if ((si_and_apm_seg_ind != 0xc0) && ((si_and_apm_seg_ind & H_8BIT_MASK)!=0x80)){
3447 /* debug g_warning("got here Frame %u",pinfo->fd->num); */
3448 /* Segmented message */
3449 save_fragmented = pinfo->fragmented;
3450 pinfo->fragmented = TRUE;
3452 if ((si_and_apm_seg_ind == 0))
3455 frag_msg = fragment_add_seq_next(parameter_tvb, offset, pinfo,
3456 (apm_Segmentation_local_ref & 0x7f), /* ID for fragments belonging together */
3457 isup_apm_msg_fragment_table, /* list of message fragments */
3458 isup_apm_msg_reassembled_table, /* list of reassembled messages */
3459 tvb_length_remaining(parameter_tvb, offset), /* fragment length - to the end */
3460 more_frag); /* More fragments? */
3462 if ((si_and_apm_seg_ind & 0x3f) !=0 && (si_and_apm_seg_ind &0x40) !=0){
3463 /* First fragment set number of fragments */
3464 fragment_set_tot_len(pinfo, apm_Segmentation_local_ref & 0x7f, isup_apm_msg_fragment_table, (si_and_apm_seg_ind & 0x3f));
3467 new_tvb = process_reassembled_data(parameter_tvb, offset, pinfo,
3468 "Reassembled Message", frag_msg, &isup_apm_msg_frag_items,
3469 NULL, parameter_tree);
3471 if (frag_msg) { /* Reassembled */
3472 if (check_col(pinfo->cinfo, COL_INFO))
3473 col_append_str(pinfo->cinfo, COL_INFO,
3474 " (Message Reassembled)");
3475 } else { /* Not last packet of reassembled Short Message */
3476 if (check_col(pinfo->cinfo, COL_INFO))
3477 col_append_str(pinfo->cinfo, COL_INFO,
3478 " (Message fragment )");
3481 pinfo->fragmented = save_fragmented;
3483 }/*isup_apm_desegment*/
3485 if ( offset == (gint)length){
3487 proto_tree_add_text(parameter_tree, parameter_tvb, offset, 0, "Empty APM-user information field" );
3490 if (new_tvb) { /* take it all */
3492 } else { /* make a new subset */
3493 next_tvb = tvb_new_subset(parameter_tvb, offset, -1, -1);
3496 proto_tree_add_text(parameter_tree, parameter_tvb, offset, -1,
3497 "APM-user information field (%u Bytes)",tvb_length_remaining(parameter_tvb, offset));
3499 switch(aci16 & 0x7fff){
3502 dissect_charging_ase_ChargingMessageType_PDU(next_tvb, pinfo, parameter_tree);
3505 /* dissect BAT ASE element, without transparent data ( Q.765.5-200006) */
3506 dissect_bat_ase_Encapsulated_Application_Information(next_tvb, pinfo, parameter_tree, 0);
3509 proto_tree_add_text(parameter_tree, parameter_tvb, offset, -1, "No further dissection of APM-user information field");
3516 /* ------------------------------------------------------------------
3517 Dissector Parameter Optional Forward Call indicators
3520 dissect_isup_optional_forward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3524 indicators = tvb_get_guint8(parameter_tvb, 0);
3525 proto_tree_add_uint(parameter_tree, hf_isup_cug_call_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
3526 proto_tree_add_boolean(parameter_tree, hf_isup_simple_segmentation_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
3527 proto_tree_add_boolean(parameter_tree, hf_isup_connected_line_identity_request_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
3530 proto_item_set_text(parameter_item,"Optional forward call indicators: %s (%u)", val_to_str(indicators & BA_8BIT_MASK, isup_CUG_call_ind_value, "spare"),indicators );
3532 /* ------------------------------------------------------------------
3533 Dissector Parameter calling party number
3536 dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3538 proto_item *address_digits_item;
3539 proto_tree *address_digits_tree;
3540 proto_item *hidden_item;
3541 guint8 indicators1, indicators2;
3542 guint8 address_digit_pair=0;
3546 char calling_number[MAXDIGITS + 1]="";
3547 e164_info_t e164_info;
3550 indicators1 = tvb_get_guint8(parameter_tvb, 0);
3551 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
3552 proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
3553 indicators2 = tvb_get_guint8(parameter_tvb, 1);
3554 number_plan = (indicators2 & 0x70)>> 4;
3555 proto_tree_add_boolean(parameter_tree, hf_isup_ni_indicator, parameter_tvb, 1, 1, indicators2);
3556 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
3557 proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
3558 proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
3561 length = tvb_length_remaining(parameter_tvb, offset);
3563 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
3565 "Calling Party Number");
3566 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
3569 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
3570 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3571 calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
3573 THROW(ReportedBoundsError);
3574 if ((length - 1) > 0 ){
3575 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3576 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3578 THROW(ReportedBoundsError);
3581 length = tvb_length_remaining(parameter_tvb, offset);
3584 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
3585 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
3586 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3588 THROW(ReportedBoundsError);
3590 proto_item_set_text(address_digits_item, "Calling Party Number: %s", calling_number);
3591 calling_number[i++] = '\0';
3592 if ( number_plan == 1 ) {
3593 e164_info.e164_number_type = CALLING_PARTY_NUMBER;
3594 e164_info.nature_of_address = indicators1 & 0x7f;
3595 e164_info.E164_number_str = calling_number;
3596 e164_info.E164_number_length = i - 1;
3597 dissect_e164_number(parameter_tvb, address_digits_tree, 2, (offset - 2), e164_info);
3598 hidden_item = proto_tree_add_string(address_digits_tree, hf_isup_calling, parameter_tvb,
3599 offset - length, length, calling_number);
3600 PROTO_ITEM_SET_HIDDEN(hidden_item);
3602 proto_tree_add_string(address_digits_tree, hf_isup_calling, parameter_tvb,
3603 offset - length, length, calling_number);
3606 proto_item_set_text(parameter_item, "Calling Party Number: %s", calling_number);
3607 tap_calling_number = ep_strdup(calling_number);
3609 /* ------------------------------------------------------------------
3610 Dissector Parameter Original called number
3613 dissect_isup_original_called_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3615 proto_item *address_digits_item;
3616 proto_tree *address_digits_tree;
3617 guint8 indicators1, indicators2;
3618 guint8 address_digit_pair=0;
3622 char calling_number[MAXDIGITS + 1]="";
3624 indicators1 = tvb_get_guint8(parameter_tvb, 0);
3625 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
3626 proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
3627 indicators2 = tvb_get_guint8(parameter_tvb, 1);
3628 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
3629 proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
3632 length = tvb_length_remaining(parameter_tvb, offset);
3635 proto_tree_add_text(parameter_tree, parameter_tvb, offset, 0, "Original Called Number (empty)");
3636 proto_item_set_text(parameter_item, "Original Called Number: (empty)");
3640 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
3642 "Original Called Number");
3643 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
3645 length = tvb_length_remaining(parameter_tvb, offset);
3647 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
3648 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3649 calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
3651 THROW(ReportedBoundsError);
3652 if ((length - 1) > 0 ){
3653 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3654 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3656 THROW(ReportedBoundsError);
3659 length = tvb_length_remaining(parameter_tvb, offset);
3662 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
3663 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
3664 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3666 THROW(ReportedBoundsError);
3668 calling_number[i++] = '\0';
3670 proto_item_set_text(address_digits_item, "Original Called Number: %s", calling_number);
3671 proto_item_set_text(parameter_item, "Original Called Number: %s", calling_number);
3674 /* ------------------------------------------------------------------
3675 Dissector Parameter Redirecting number
3678 dissect_isup_redirecting_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3680 proto_item *address_digits_item;
3681 proto_tree *address_digits_tree;
3682 guint8 indicators1, indicators2;
3683 guint8 address_digit_pair=0;
3687 char calling_number[MAXDIGITS + 1]="";
3689 indicators1 = tvb_get_guint8(parameter_tvb, 0);
3690 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
3691 proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
3692 indicators2 = tvb_get_guint8(parameter_tvb, 1);
3693 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
3694 proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
3697 length = tvb_length_remaining(parameter_tvb, offset);
3700 proto_tree_add_text(parameter_tree, parameter_tvb, offset, 0, "Redirecting Number (empty)");
3701 proto_item_set_text(parameter_item, "Redirecting Number: (empty)");
3705 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
3707 "Redirecting Number");
3708 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
3710 length = tvb_length_remaining(parameter_tvb, offset);
3712 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
3713 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3714 calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
3716 THROW(ReportedBoundsError);
3717 if ((length - 1) > 0 ){
3718 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3719 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3721 THROW(ReportedBoundsError);
3724 length = tvb_length_remaining(parameter_tvb, offset);
3727 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
3728 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
3729 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3731 THROW(ReportedBoundsError);
3733 calling_number[i++] = '\0';
3735 proto_item_set_text(address_digits_item, "Redirecting Number: %s", calling_number);
3736 proto_tree_add_string(address_digits_tree, hf_isup_redirecting, parameter_tvb, offset - length, length, calling_number);
3737 proto_item_set_text(parameter_item, "Redirecting Number: %s", calling_number);
3739 /* ------------------------------------------------------------------
3740 Dissector Parameter Redirection number
3743 dissect_isup_redirection_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3745 proto_item *address_digits_item;
3746 proto_tree *address_digits_tree;
3747 guint8 indicators1, indicators2;
3748 guint8 address_digit_pair=0;
3752 char called_number[MAXDIGITS + 1]="";
3754 indicators1 = tvb_get_guint8(parameter_tvb, 0);
3755 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
3756 proto_tree_add_uint(parameter_tree, hf_isup_called_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
3757 indicators2 = tvb_get_guint8(parameter_tvb, 1);
3758 proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
3759 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
3762 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
3764 "Redirection Number");
3765 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
3767 length = tvb_length_remaining(parameter_tvb, offset);
3769 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
3770 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3771 called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
3773 THROW(ReportedBoundsError);
3774 if ((length - 1) > 0 ){
3775 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3776 called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3778 THROW(ReportedBoundsError);
3781 length = tvb_length_remaining(parameter_tvb, offset);
3784 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
3785 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
3786 called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3788 THROW(ReportedBoundsError);
3790 called_number[i++] = '\0';
3792 proto_item_set_text(address_digits_item, "Redirection Number: %s", called_number);
3793 proto_item_set_text(parameter_item, "Redirection Number: %s", called_number);
3795 /* ------------------------------------------------------------------
3796 Dissector Parameter Connection request
3799 dissect_isup_connection_request_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3803 guint8 protocol_class, credit, offset=0;
3805 local_ref = tvb_get_ntoh24(parameter_tvb, 0);
3806 proto_tree_add_text(parameter_tree, parameter_tvb, offset, LOCAL_REF_LENGTH, "Local Reference: %u", local_ref);
3807 offset = LOCAL_REF_LENGTH;
3808 spc = tvb_get_letohs(parameter_tvb,offset) & 0x3FFF; /*since 1st 2 bits spare */
3809 proto_tree_add_text(parameter_tree, parameter_tvb, offset, SPC_LENGTH, "Signalling Point Code: %u", spc);
3810 offset += SPC_LENGTH;
3811 protocol_class = tvb_get_guint8(parameter_tvb, offset);
3812 proto_tree_add_text(parameter_tree, parameter_tvb, offset, PROTOCOL_CLASS_LENGTH, "Protocol Class: %u", protocol_class);
3813 offset += PROTOCOL_CLASS_LENGTH;
3814 credit = tvb_get_guint8(parameter_tvb, offset);
3815 proto_tree_add_text(parameter_tree, parameter_tvb, offset, CREDIT_LENGTH, "Credit: %u", credit);
3816 offset += CREDIT_LENGTH;
3818 proto_item_set_text(parameter_item, "Connection request: Local Reference = %u, SPC = %u, Protocol Class = %u, Credit = %u", local_ref, spc, protocol_class, credit);
3820 /* ------------------------------------------------------------------
3821 Dissector Parameter Redirection information
3824 dissect_isup_redirection_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3826 if (tvb_length(parameter_tvb) == 2){
3828 indicators = tvb_get_ntohs(parameter_tvb, 0);
3829 proto_tree_add_uint(parameter_tree, hf_isup_redirecting_ind, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
3830 proto_tree_add_uint(parameter_tree, hf_isup_original_redirection_reason, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
3831 proto_tree_add_uint(parameter_tree, hf_isup_redirection_counter, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
3832 proto_tree_add_uint(parameter_tree, hf_isup_redirection_reason, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
3833 proto_item_set_text(parameter_item, "Redirection Information");
3835 else { /* ISUP'88 (blue book) */
3837 indicators = tvb_get_guint8(parameter_tvb, 0) * 0x100; /*since 2nd octet isn't present*/
3838 proto_tree_add_uint(parameter_tree, hf_isup_redirecting_ind, parameter_tvb, 0, 1, indicators);
3839 proto_tree_add_uint(parameter_tree, hf_isup_original_redirection_reason, parameter_tvb,0 , 1, indicators);
3840 proto_item_set_text(parameter_item, "Redirection Information (2nd octet not present since ISUP '88)");
3843 /* ------------------------------------------------------------------
3844 Dissector Parameter Closed user group interlock code
3847 dissect_isup_closed_user_group_interlock_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3849 char NI_digits[5]="";
3853 digit_pair = tvb_get_guint8(parameter_tvb, 0);
3854 NI_digits[0] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
3855 NI_digits[1] = number_to_char(digit_pair & DCBA_8BIT_MASK);
3856 digit_pair = tvb_get_guint8(parameter_tvb, 1);
3857 NI_digits[2] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
3858 NI_digits[3] = number_to_char(digit_pair & DCBA_8BIT_MASK);
3859 NI_digits[4] = '\0';
3860 proto_tree_add_text(parameter_tree, parameter_tvb, 0, 2, "Network Identity: %s", NI_digits);
3861 bin_code = tvb_get_ntohs(parameter_tvb, 2);
3862 proto_tree_add_text(parameter_tree, parameter_tvb, 3, 2, "Binary Code: 0x%x", bin_code);
3863 proto_item_set_text(parameter_item, "Closed user group interlock code: NI = %s, Binary code = 0x%x", NI_digits, bin_code);
3865 /* ------------------------------------------------------------------
3866 Dissector Parameter User service information- no detailed dissection since defined in Rec. Q.931
3869 dissect_isup_user_service_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3870 { guint length = tvb_length(parameter_tvb);
3871 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length,
3872 "User service information (-> Q.931 Bearer_capability)");
3873 proto_item_set_text(parameter_item, "User service information, (%u byte%s length)",
3874 length , plurality(length, "", "s"));
3875 dissect_q931_bearer_capability_ie(parameter_tvb,
3879 /* ------------------------------------------------------------------
3880 Dissector Parameter Signalling point code
3883 dissect_isup_signalling_point_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3887 spc = tvb_get_letohs(parameter_tvb, 0) & 0x3FFF; /*since 1st 2 bits spare */
3888 proto_tree_add_text(parameter_tree, parameter_tvb, 0, SIGNALLING_POINT_CODE_LENGTH, "Signalling Point Code: %u", spc);
3890 proto_item_set_text(parameter_item, "Signalling point code: %u", spc);
3892 /* ------------------------------------------------------------------
3893 Dissector Parameter Connected number
3896 dissect_isup_connected_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3898 proto_item *address_digits_item;
3899 proto_tree *address_digits_tree;
3900 guint8 indicators1, indicators2;
3901 guint8 address_digit_pair=0;
3905 char calling_number[MAXDIGITS + 1]="";
3907 indicators1 = tvb_get_guint8(parameter_tvb, 0);
3908 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
3909 proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
3910 indicators2 = tvb_get_guint8(parameter_tvb, 1);
3911 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
3912 proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
3913 proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
3916 length = tvb_length_remaining(parameter_tvb, offset);
3918 return; /* empty connected number */
3919 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
3921 "Connected Number");
3922 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
3925 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
3926 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3927 calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
3929 THROW(ReportedBoundsError);
3930 if ((length - 1) > 0 ){
3931 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3932 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3934 THROW(ReportedBoundsError);
3937 length = tvb_length_remaining(parameter_tvb, offset);
3940 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
3941 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
3942 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3944 THROW(ReportedBoundsError);
3946 calling_number[i++] = '\0';
3948 proto_item_set_text(address_digits_item, "Connected Number: %s", calling_number);
3949 proto_item_set_text(parameter_item, "Connected Number: %s", calling_number);
3952 /* ------------------------------------------------------------------
3953 Dissector Transit network selection
3956 dissect_isup_transit_network_selection_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
3958 proto_item *address_digits_item;
3959 proto_tree *address_digits_tree;
3961 guint8 address_digit_pair=0;
3965 char network_id[MAXDIGITS + 1]="";
3967 indicators = tvb_get_guint8(parameter_tvb, 0);
3968 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators);
3969 proto_tree_add_uint(parameter_tree, hf_isup_type_of_network_identification, parameter_tvb, 0, 1, indicators);
3970 proto_tree_add_uint(parameter_tree, hf_isup_network_identification_plan, parameter_tvb, 0, 1, indicators);
3973 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
3975 "Network identification");
3976 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
3978 length = tvb_length_remaining(parameter_tvb, offset);
3980 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
3981 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3982 network_id[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
3984 THROW(ReportedBoundsError);
3985 if ((length - 1) > 0 ){
3986 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
3987 network_id[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3989 THROW(ReportedBoundsError);
3992 length = tvb_length_remaining(parameter_tvb, offset);
3995 if (((indicators & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
3996 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
3997 network_id[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
3999 THROW(ReportedBoundsError);
4001 network_id[i++] = '\0';
4003 proto_item_set_text(address_digits_item, "Network identification: %s", network_id);
4004 proto_item_set_text(parameter_item, "Transit network selection: %s", network_id);
4007 /* ------------------------------------------------------------------
4008 Dissector Parameter Circuit assignment map
4011 dissect_isup_circuit_assignment_map_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4014 map_type = tvb_get_guint8(parameter_tvb, 0);
4015 proto_tree_add_uint(parameter_tree, hf_isup_map_type, parameter_tvb, 0, 1, map_type);
4016 proto_tree_add_text(parameter_tree, parameter_tvb, 1, 5, "Circuit assignment map (bit position indicates usage of corresponding circuit->3.69/Q.763)");
4017 proto_item_set_text(parameter_item, "Circuit assignment map");
4019 /* ------------------------------------------------------------------
4020 Dissector Parameter Automatic congestion level
4023 dissect_isup_automatic_congestion_level_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4024 { guint8 congestion_level;
4026 congestion_level = tvb_get_guint8(parameter_tvb, 0);
4027 proto_tree_add_uint(parameter_tree, hf_isup_automatic_congestion_level, parameter_tvb, 0, AUTO_CONGEST_LEVEL_LENGTH, congestion_level);
4028 proto_item_set_text(parameter_item, "Automatic congestion level: %s (%u)", val_to_str(congestion_level, isup_auto_congestion_level_value, "spare"), congestion_level);
4030 /* ------------------------------------------------------------------
4031 Dissector Parameter Optional backward Call indicators
4034 dissect_isup_optional_backward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4038 indicators = tvb_get_guint8(parameter_tvb, 0);
4039 proto_tree_add_boolean(parameter_tree, hf_isup_inband_information_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
4040 proto_tree_add_boolean(parameter_tree, hf_isup_call_diversion_may_occur_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
4041 proto_tree_add_boolean(parameter_tree, hf_isup_simple_segmentation_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
4042 proto_tree_add_boolean(parameter_tree, hf_isup_mlpp_user_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
4045 proto_item_set_text(parameter_item,"Optional backward call indicators: 0x%x", indicators );
4047 /* ------------------------------------------------------------------
4048 Dissector Parameter User-to-user indicators
4050 static const true_false_string isup_UUI_type_value = {
4054 static const value_string isup_UUI_request_service_values[] = {
4055 { 0, "No information"},
4057 { 2, "Request, not essential"},
4058 { 3, "Request,essential"},
4062 static const value_string isup_UUI_response_service_values[] = {
4063 { 0, "No information"},
4064 { 1, "Not provided"},
4069 static const true_false_string isup_UUI_network_discard_ind_value= {
4070 "User-to-user information discarded by the network",
4075 dissect_isup_user_to_user_indicators_parameter(tvbuff_t *parameter_tvb,
4076 proto_tree *parameter_tree,
4077 proto_item *parameter_item)
4081 indicators = tvb_get_guint8(parameter_tvb, 0);
4082 proto_tree_add_boolean(parameter_tree, hf_isup_UUI_type, parameter_tvb, 0, 1, indicators);
4083 if ( (indicators & 0x01) == 0 ){
4085 proto_tree_add_uint(parameter_tree, hf_isup_UUI_req_service1, parameter_tvb, 0, 1, indicators);
4086 proto_tree_add_uint(parameter_tree, hf_isup_UUI_req_service2, parameter_tvb, 0, 1, indicators);
4087 proto_tree_add_uint(parameter_tree, hf_isup_UUI_req_service3, parameter_tvb, 0, 1, indicators);
4091 proto_tree_add_uint(parameter_tree, hf_isup_UUI_res_service1, parameter_tvb, 0, 1, indicators);
4092 proto_tree_add_uint(parameter_tree, hf_isup_UUI_res_service2, parameter_tvb, 0, 1, indicators);
4093 proto_tree_add_uint(parameter_tree, hf_isup_UUI_res_service3, parameter_tvb, 0, 1, indicators);
4094 proto_tree_add_boolean(parameter_tree, hf_isup_UUI_network_discard_ind, parameter_tvb, 0, 1, indicators);
4097 proto_item_set_text(parameter_item,"User-to-user indicators: 0x%x", indicators );
4099 /* ------------------------------------------------------------------
4100 Dissector Parameter Original ISC point code
4103 dissect_isup_original_isc_point_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4107 spc = tvb_get_letohs(parameter_tvb, 0) & 0x3FFF; /*since 1st 2 bits spare */
4108 proto_tree_add_text(parameter_tree, parameter_tvb, 0, ORIGINAL_ISC_POINT_CODE_LENGTH, "Origination ISC Point Code: %u", spc);
4110 proto_item_set_text(parameter_item, "Origination ISC point code: %u", spc);
4112 /* ------------------------------------------------------------------
4113 Dissector Parameter Generic notification indicator
4116 dissect_isup_generic_notification_indicator_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4120 indicators = tvb_get_guint8(parameter_tvb, 0);
4121 proto_tree_add_text(parameter_tree, parameter_tvb, 0, GENERIC_NOTIFICATION_IND_LENGTH, "Generic notification indicator: 0x%x (refer to 3.25/Q.763 for detailed decoding)", indicators );
4122 proto_item_set_text(parameter_item,"Generic notification indicator: 0x%x", indicators );
4124 /* ------------------------------------------------------------------
4125 Dissector Parameter Call history information
4128 dissect_isup_call_history_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4132 info = tvb_get_ntohs(parameter_tvb, 0);
4133 proto_tree_add_text(parameter_tree, parameter_tvb, 0, CALL_HISTORY_INFO_LENGTH, "Call history info: propagation delay = %u ms", info);
4134 proto_item_set_text(parameter_item,"Call history info: propagation delay = %u ms", info);
4136 /* ------------------------------------------------------------------
4137 Dissector Parameter Access delivery information
4140 dissect_isup_access_delivery_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4143 indicator = tvb_get_guint8(parameter_tvb, 0);
4144 proto_tree_add_boolean(parameter_tree, hf_isup_access_delivery_ind, parameter_tvb, 0, ACCESS_DELIVERY_INFO_LENGTH, indicator);
4145 proto_item_set_text(parameter_item, "Access delivery information: 0x%x", indicator);
4147 /* ------------------------------------------------------------------
4148 Dissector Parameter Network specific facility
4151 dissect_isup_network_specific_facility_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4152 { guint length = tvb_length(parameter_tvb);
4153 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Network specific facility (refer to 3.36/Q.763 for detailed decoding)");
4154 proto_item_set_text(parameter_item, "Network specific facility (%u byte%s length)", length , plurality(length, "", "s"));
4156 /* ------------------------------------------------------------------
4157 Dissector Parameter User service information prime
4160 dissect_isup_user_service_information_prime_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4161 { guint length = tvb_length(parameter_tvb);
4162 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length,
4163 "User service information prime (-> Q.931 Bearer capability information IE)");
4164 dissect_q931_bearer_capability_ie(parameter_tvb,
4168 proto_item_set_text(parameter_item, "User service information prime, (%u byte%s length)",
4169 length , plurality(length, "", "s"));
4171 /* ------------------------------------------------------------------
4172 Dissector Parameter Propagation delay counter
4175 dissect_isup_propagation_delay_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4179 info = tvb_get_ntohs(parameter_tvb, 0);
4180 proto_tree_add_text(parameter_tree, parameter_tvb, 0, PROPAGATION_DELAY_COUNT_LENGTH, "Propagation delay counter = %u ms", info);
4181 proto_item_set_text(parameter_item,"Propagation delay counter = %u ms", info);
4183 /* ------------------------------------------------------------------
4184 Dissector Parameter Remote operations
4187 dissect_isup_remote_operations_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4188 { guint length = tvb_length(parameter_tvb);
4189 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Remote operations");
4190 proto_item_set_text(parameter_item, "Remote operations (%u byte%s length)", length , plurality(length, "", "s"));
4192 /* ------------------------------------------------------------------
4193 Dissector Parameter Service activation
4196 dissect_isup_service_activation_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4199 guint8 feature_code;
4200 guint length = tvb_length(parameter_tvb);
4201 for (i=0; i< length; i++){
4202 feature_code = tvb_get_guint8(parameter_tvb, i);
4203 proto_tree_add_text(parameter_tree, parameter_tvb, i, 1, "Feature Code %u: %u", i+1, feature_code);
4205 proto_item_set_text(parameter_item, "Service Activation (%u byte%s length)", length , plurality(length, "", "s"));
4207 /* ------------------------------------------------------------------
4208 Dissector Parameter User service information prime - no detailed dissection since defined in Rec. Q.931
4211 dissect_isup_user_teleservice_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4213 guint length = tvb_length(parameter_tvb);
4214 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length,
4215 "User teleservice information (-> Q.931 High Layer Compatibility IE)");
4217 dissect_q931_high_layer_compat_ie(parameter_tvb, 0, length, parameter_tree);
4219 proto_item_set_text(parameter_item,
4220 "User teleservice information");
4222 /* ------------------------------------------------------------------
4223 Dissector Parameter Transmission medium requirement used
4226 dissect_isup_transmission_medium_used_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4228 guint8 transmission_medium_requirement;
4230 transmission_medium_requirement = tvb_get_guint8(parameter_tvb, 0);
4231 proto_tree_add_uint(parameter_tree, hf_isup_transmission_medium_requirement_prime, parameter_tvb, 0, TRANSMISSION_MEDIUM_RQMT_PRIME_LENGTH,transmission_medium_requirement);
4233 proto_item_set_text(parameter_item, "Transmission medium used: %u (%s)", transmission_medium_requirement, val_to_str(transmission_medium_requirement, isup_transmission_medium_requirement_prime_value, "spare/reserved"));
4235 /* ------------------------------------------------------------------
4236 Dissector Parameter Call diversion information
4239 dissect_isup_call_diversion_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4242 indicator = tvb_get_guint8(parameter_tvb, 0);
4243 proto_tree_add_text(parameter_tree, parameter_tvb, 0, CALL_DIV_INFO_LENGTH, "Call diversion information: 0x%x (refer to 3.6/Q.763 for detailed decoding)", indicator);
4244 proto_item_set_text(parameter_item, "Call diversion information: 0x%x", indicator);
4246 /* ------------------------------------------------------------------
4247 Dissector Parameter Echo control information
4249 static const value_string OECD_inf_ind_vals[] = {
4250 {0x00, "no information"},
4251 {0x01, "outgoing echo control device not included and not available"},
4252 {0x02, "outgoing echo control device included"},
4253 {0x03, "outgoing echo control device not included but available"},
4256 static const value_string IECD_inf_ind_vals[] = {
4257 {0x00, "no information"},
4258 {0x01, "incoming echo control device not included and not available"},
4259 {0x02, "incoming echo control device included"},
4260 {0x03, "incoming echo control device not included but available"},
4264 static const value_string OECD_req_ind_vals[] = {
4265 {0x00, "no information"},
4266 {0x01, "outgoing echo control device activation request"},
4267 {0x02, "outgoing echo control device deactivation request"},
4272 static const value_string IECD_req_ind_vals[] = {
4273 {0x00, "no information"},
4274 {0x01, "incoming echo control device activation request"},
4275 {0x02, "incoming echo control device deactivation request"},
4281 dissect_isup_echo_control_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4284 indicator = tvb_get_guint8(parameter_tvb, 0);
4285 proto_tree_add_text(parameter_tree, parameter_tvb, 0, ECHO_CONTROL_INFO_LENGTH,
4286 "Echo control information: 0x%x", indicator);
4288 proto_tree_add_uint(parameter_tree, hf_isup_OECD_inf_ind,
4289 parameter_tvb, offset, 1, indicator );
4291 proto_tree_add_uint(parameter_tree, hf_isup_IECD_inf_ind,
4292 parameter_tvb, offset, 1, indicator );
4294 proto_tree_add_uint(parameter_tree, hf_isup_OECD_req_ind,
4295 parameter_tvb, offset, 1, indicator );
4297 proto_tree_add_uint(parameter_tree, hf_isup_IECD_req_ind,
4298 parameter_tvb, offset, 1, indicator );
4300 proto_item_set_text(parameter_item, "Echo control information: 0x%x", indicator);
4302 /* ------------------------------------------------------------------
4303 Dissector Parameter Message compatibility information
4306 static const true_false_string isup_pass_on_not_possible_indicator_value = {
4307 "discard information",
4312 dissect_isup_message_compatibility_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4314 guint length = tvb_length(parameter_tvb);
4315 guint instruction_indicators;
4317 instruction_indicators = tvb_get_guint8(parameter_tvb, offset);
4319 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length,
4320 "Message compatibility information");
4322 proto_tree_add_boolean(parameter_tree, hf_isup_transit_at_intermediate_exchange_ind,
4323 parameter_tvb, offset, 1, instruction_indicators );
4325 proto_tree_add_boolean(parameter_tree, hf_isup_Release_call_ind,
4326 parameter_tvb, offset, 1, instruction_indicators );
4328 proto_tree_add_boolean(parameter_tree, hf_isup_Send_notification_ind,
4329 parameter_tvb, offset, 1, instruction_indicators );
4331 proto_tree_add_boolean(parameter_tree, hf_isup_Discard_message_ind_value,
4332 parameter_tvb, offset, 1, instruction_indicators );
4334 proto_tree_add_boolean(parameter_tree, hf_isup_pass_on_not_possible_indicator2,
4335 parameter_tvb, offset, 1,instruction_indicators);
4337 proto_tree_add_uint(parameter_tree, hf_isup_Broadband_narrowband_interworking_ind2,
4338 parameter_tvb, offset, 1,instruction_indicators);
4340 proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind ,
4341 parameter_tvb, offset, 1, instruction_indicators );
4343 proto_item_set_text(parameter_item, "Message compatibility information (%u byte%s length)",
4344 length , plurality(length, "", "s"));
4346 /* ------------------------------------------------------------------
4347 Dissector Parameter compatibility information
4349 static const true_false_string isup_transit_at_intermediate_exchange_ind_value = {
4350 "End node interpretation",
4351 "Transit interpretation"
4355 static const true_false_string isup_Discard_message_ind_value = {
4357 "Do not discard message (pass on)",
4360 static const true_false_string isup_Discard_parameter_ind_value = {
4361 "Discard parameter",
4362 "Do not discard parameter (pass on)",
4365 static const value_string isup_Pass_on_not_possible_indicator_vals[] = {
4366 { 0x00, "Release call" },
4367 { 0x01, "Discard message" },
4368 { 0x02, "Discard parameter" },
4369 { 0x03, "Reserved (interpreted as 00)" },
4372 static const value_string ISUP_Broadband_narrowband_interworking_indicator_vals[] = {
4373 { 0x00, "Pass on" },
4374 { 0x01, "Discard message" },
4375 { 0x02, "Release call" },
4376 { 0x03, "Discard parameter" },
4381 dissect_isup_parameter_compatibility_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4383 guint length = tvb_length(parameter_tvb);
4385 guint8 upgraded_parameter, upgraded_parameter_no;
4387 guint8 instruction_indicators;
4389 upgraded_parameter_no = 0;
4391 proto_item_set_text(parameter_item, "Parameter compatibility information (%u byte%s length)", length , plurality(length, "", "s"));
4392 /* etxrab Decoded as per Q.763 section 3.41 */
4395 upgraded_parameter_no = upgraded_parameter_no + 1;
4396 upgraded_parameter = tvb_get_guint8(parameter_tvb, offset);
4398 proto_tree_add_text(parameter_tree, parameter_tvb, offset, 1,
4399 "Upgraded parameter no: %u = %s", upgraded_parameter_no,
4400 val_to_str(upgraded_parameter, isup_parameter_type_value, "unknown (%u)"));
4403 instruction_indicators = tvb_get_guint8(parameter_tvb, offset);
4405 proto_tree_add_text(parameter_tree, parameter_tvb, offset, 1,
4406 "Instruction indicators: 0x%x ",
4407 instruction_indicators);
4409 proto_tree_add_boolean(parameter_tree, hf_isup_transit_at_intermediate_exchange_ind,
4410 parameter_tvb, offset, 1, instruction_indicators );
4412 proto_tree_add_boolean(parameter_tree, hf_isup_Release_call_ind, parameter_tvb, offset, 1, instruction_indicators );
4414 proto_tree_add_boolean(parameter_tree, hf_isup_Send_notification_ind, parameter_tvb, offset, 1, instruction_indicators );
4416 proto_tree_add_boolean(parameter_tree, hf_isup_Discard_message_ind_value, parameter_tvb, offset, 1, instruction_indicators );
4418 proto_tree_add_boolean(parameter_tree, hf_isup_Discard_parameter_ind, parameter_tvb, offset, 1, instruction_indicators );
4420 proto_tree_add_uint(parameter_tree, hf_isup_Pass_on_not_possible_indicator, parameter_tvb, offset, 1,instruction_indicators);
4422 proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind , parameter_tvb, offset, 1, instruction_indicators );
4426 if (!(instruction_indicators & H_8BIT_MASK)) {
4429 instruction_indicators = tvb_get_guint8(parameter_tvb, offset);
4430 proto_tree_add_uint(parameter_tree, hf_isup_Broadband_narrowband_interworking_ind, parameter_tvb, offset, 1,instruction_indicators);
4441 /* ------------------------------------------------------------------
4442 Dissector Parameter MLPP precedence
4445 dissect_isup_mlpp_precedence_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4447 char NI_digits[5]="";
4448 char *temp_text = "";
4449 guint8 indicators, digit_pair;
4452 indicators = tvb_get_guint8(parameter_tvb, 0);
4453 switch ((indicators & 0x60) >> 5) {
4455 temp_text = "Allowed";
4458 temp_text = "Not Allowed";
4461 temp_text = "Path reserved";
4464 temp_text = "Spare";
4467 proto_tree_add_text(parameter_tree, parameter_tvb, 0, 1, "Look forward busy: %s", temp_text);
4468 switch (indicators & 0xf) {
4470 temp_text = "Flash Override";
4473 temp_text = "Flash";
4476 temp_text = "Immediate";
4479 temp_text = "Priority";
4482 temp_text = "Routine";
4485 temp_text = "Spare";
4490 proto_tree_add_text(parameter_tree, parameter_tvb, 0, 1, "Precedence Level: %s",temp_text);
4491 digit_pair = tvb_get_guint8(parameter_tvb, 1);
4492 NI_digits[0] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
4493 NI_digits[1] = number_to_char(digit_pair & DCBA_8BIT_MASK);
4494 digit_pair = tvb_get_guint8(parameter_tvb, 2);
4495 NI_digits[2] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
4496 NI_digits[3] = number_to_char(digit_pair & DCBA_8BIT_MASK);
4497 NI_digits[4] = '\0';
4498 proto_tree_add_text(parameter_tree, parameter_tvb, 1, 2, "Network Identity: %s", NI_digits);
4499 bin_code = tvb_get_ntoh24(parameter_tvb, 3);
4500 proto_tree_add_text(parameter_tree, parameter_tvb, 3, 3, "MLPP service domain: 0x%x", bin_code);
4501 proto_item_set_text(parameter_item, "MLPP precedence: Prec = %s, NI = %s, MLPP service domain = 0x%x", temp_text, NI_digits, bin_code);
4503 /* ------------------------------------------------------------------
4504 Dissector Parameter MCID request indicators
4507 dissect_isup_mcid_request_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4510 indicator = tvb_get_guint8(parameter_tvb, 0);
4511 proto_tree_add_text(parameter_tree, parameter_tvb, 0,MCID_REQUEST_IND_LENGTH, "MCID request indicators: 0x%x (MCID requested by Bit1=1, Holding requested by Bit2=1 see 3.31/Q.763)", indicator);
4512 proto_item_set_text(parameter_item, "MCID request indicators: 0x%x", indicator);
4514 /* ------------------------------------------------------------------
4515 Dissector Parameter MCID response indicators
4518 dissect_isup_mcid_response_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4521 indicator = tvb_get_guint8(parameter_tvb, 0);
4522 proto_tree_add_text(parameter_tree, parameter_tvb, 0,MCID_RESPONSE_IND_LENGTH, "MCID response indicators: 0x%x (MCID included if Bit1=1, Holding provided if Bit2=1 see 3.32/Q.763)", indicator);
4523 proto_item_set_text(parameter_item, "MCID response indicators: 0x%x", indicator);
4525 /* ------------------------------------------------------------------
4526 Dissector Parameter Hop counter
4529 dissect_isup_hop_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4532 counter = tvb_get_guint8(parameter_tvb, 0) & EDCBA_8BIT_MASK; /* since bits H,G and F are spare */
4533 proto_tree_add_text(parameter_tree, parameter_tvb, 0, HOP_COUNTER_LENGTH, "Hop counter: %u", counter);
4534 proto_item_set_text(parameter_item, "Hop counter: %u", counter);
4536 /* ------------------------------------------------------------------
4537 Dissector Parameter Originating line information
4540 dissect_isup_orig_line_info_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4543 info = tvb_get_guint8(parameter_tvb, 0);
4544 proto_tree_add_text(parameter_tree, parameter_tvb, 0, ORIG_LINE_INFO_LENGTH, "Originating line info: %u", info);
4545 proto_item_set_text(parameter_item, "Originating line info: %u (ANI II if < 51, reserved otherwise)", info);
4547 /* ------------------------------------------------------------------
4548 Dissector Parameter Transmission medium requirement prime
4551 dissect_isup_transmission_medium_requirement_prime_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4553 guint8 transmission_medium_requirement;
4555 transmission_medium_requirement = tvb_get_guint8(parameter_tvb, 0);
4556 proto_tree_add_uint(parameter_tree, hf_isup_transmission_medium_requirement_prime, parameter_tvb, 0, TRANSMISSION_MEDIUM_RQMT_PRIME_LENGTH,transmission_medium_requirement);
4558 proto_item_set_text(parameter_item, "Transmission medium requirement prime: %u (%s)", transmission_medium_requirement, val_to_str(transmission_medium_requirement, isup_transmission_medium_requirement_prime_value, "spare/reserved"));
4561 /* ------------------------------------------------------------------
4562 Dissector Parameter location number
4565 dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4567 proto_item *address_digits_item;
4568 proto_tree *address_digits_tree;
4569 guint8 indicators1, indicators2;
4570 guint8 address_digit_pair=0;
4574 char calling_number[MAXDIGITS + 1]="";
4576 indicators1 = tvb_get_guint8(parameter_tvb, 0);
4577 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
4578 proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
4579 indicators2 = tvb_get_guint8(parameter_tvb, 1);
4580 proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
4581 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
4582 if ((indicators2 & GFE_8BIT_MASK) == 0x50)
4583 proto_tree_add_text(parameter_tree, parameter_tvb, 1, 1, "Different meaning for Location Number: Numbering plan indicator = private numbering plan");
4584 proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
4585 proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
4587 /* NOTE When the address presentation restricted indicator indicates address not available, the
4588 * subfields in items a), b), c) and d) are coded with 0's, and the screening indicator is set to 11
4589 * (network provided).
4590 * BUG 938 - Just check if there is someting more to dissect.
4592 if (tvb_length_remaining(parameter_tvb, offset) < 3){
4593 proto_tree_add_text(parameter_tree, parameter_tvb, 1, -1, "Location number: address not available");
4594 proto_item_set_text(parameter_item, "Location number: address not available");
4600 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
4603 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
4605 length = tvb_length_remaining(parameter_tvb, offset);
4607 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
4608 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
4609 calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
4611 THROW(ReportedBoundsError);
4612 if ((length - 1) > 0 ){
4613 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
4614 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
4616 THROW(ReportedBoundsError);
4619 length = tvb_length_remaining(parameter_tvb, offset);
4622 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
4623 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
4624 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
4626 THROW(ReportedBoundsError);
4628 calling_number[i++] = '\0';
4630 proto_item_set_text(address_digits_item, "Location number: %s", calling_number);
4631 proto_item_set_text(parameter_item, "Location number: %s", calling_number);
4634 /* ------------------------------------------------------------------
4635 Dissector Parameter Redirection number restiriction
4638 dissect_isup_redirection_number_restriction_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4642 indicator = tvb_get_guint8(parameter_tvb, 0);
4643 switch (indicator & BA_8BIT_MASK) {
4645 proto_tree_add_text(parameter_tree, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: Presentation allowed");
4648 proto_tree_add_text(parameter_tree, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: Presentation restricted");
4651 proto_tree_add_text(parameter_tree, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: spare");
4654 proto_item_set_text(parameter_item, "Redirection number restriction: 0x%x ", indicator);
4656 /* ------------------------------------------------------------------
4657 Dissector Parameter Call transfer identity
4660 dissect_isup_call_transfer_reference_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4663 id = tvb_get_guint8(parameter_tvb, 0);
4664 proto_tree_add_text(parameter_tree, parameter_tvb, 0, CALL_TRANSFER_REF_LENGTH, "Call transfer identity: %u", id);
4665 proto_item_set_text(parameter_item, "Call transfer reference: %u", id);
4667 /* ------------------------------------------------------------------
4668 Dissector Parameter Loop prevention
4671 dissect_isup_loop_prevention_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4675 indicator = tvb_get_guint8(parameter_tvb, 0);
4676 if ((indicator & A_8BIT_MASK)==0) {
4677 proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "Type: Request");
4678 proto_item_set_text(parameter_item, "Loop prevention indicators: Request (%u)", indicator);
4681 proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "Type: Response");
4682 proto_tree_add_uint(parameter_tree, hf_isup_loop_prevention_response_ind, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, indicator);
4683 proto_item_set_text(parameter_item, "Loop prevention indicators: Response (%u)", indicator);
4686 /* ------------------------------------------------------------------
4687 Dissector Parameter Call transfer number
4690 dissect_isup_call_transfer_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4692 proto_item *address_digits_item;
4693 proto_tree *address_digits_tree;
4694 guint8 indicators1, indicators2;
4695 guint8 address_digit_pair=0;
4699 char calling_number[MAXDIGITS + 1]="";
4701 indicators1 = tvb_get_guint8(parameter_tvb, 0);
4702 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
4703 proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
4704 indicators2 = tvb_get_guint8(parameter_tvb, 1);
4705 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
4706 if ((indicators2 & GFE_8BIT_MASK) == 0x50)
4707 proto_tree_add_text(parameter_tree, parameter_tvb, 1, 1, "Different meaning for Call Transfer Number: Numbering plan indicator = private numbering plan");
4708 proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
4709 proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 1, 1, indicators2);
4712 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
4714 "Call transfer number");
4715 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
4717 length = tvb_length_remaining(parameter_tvb, offset);
4719 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
4720 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
4721 calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
4723 THROW(ReportedBoundsError);
4724 if ((length - 1) > 0 ){
4725 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
4726 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
4728 THROW(ReportedBoundsError);
4731 length = tvb_length_remaining(parameter_tvb, offset);
4734 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
4735 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
4736 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
4738 THROW(ReportedBoundsError);
4740 calling_number[i++] = '\0';
4742 proto_item_set_text(address_digits_item, "Call transfer number: %s", calling_number);
4743 proto_item_set_text(parameter_item, "Call transfer number: %s", calling_number);
4746 /* ------------------------------------------------------------------
4747 Dissector Parameter CCSS
4750 dissect_isup_ccss_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4754 indicator = tvb_get_guint8(parameter_tvb, 0);
4755 if ((indicator & A_8BIT_MASK)==0) {
4756 proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "CCSS call indicator: no indication");
4757 proto_item_set_text(parameter_item, "CCSS call indicator: no indication (%u)", indicator);
4760 proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "CCSS call indicator: CCSS call");
4761 proto_item_set_text(parameter_item, "CCSS call indicator: CCSS call (%u)", indicator);
4764 /* ------------------------------------------------------------------
4765 Parameter Forward GVNS
4768 dissect_isup_forward_gvns_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4769 { guint length = tvb_length(parameter_tvb);
4770 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Forward GVNS (refer to 3.66/Q.763 for detailed decoding)");
4771 proto_item_set_text(parameter_item, "Forward GVNS (%u Byte%s)", length , plurality(length, "", "s"));
4773 /* ------------------------------------------------------------------
4774 Parameter Redirect capability
4777 dissect_isup_redirect_capability_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4778 { guint length = tvb_length(parameter_tvb);
4779 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Redirect capability (format is a national matter)");
4780 proto_item_set_text(parameter_item, "Redirect Capability (%u Byte%s)", length , plurality(length, "", "s"));
4782 /* ------------------------------------------------------------------
4783 Dissector Parameter Backward GVNS
4786 dissect_isup_backward_gvns_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4789 indicator = tvb_get_guint8(parameter_tvb, 0);
4790 proto_tree_add_text(parameter_tree, parameter_tvb, 0, BACKWARD_GVNS_LENGTH, "Backward GVNS: 0x%x (refer to 3.62/Q.763 for detailed decoding)", indicator);
4791 proto_item_set_text(parameter_item, "Backward GVNS: 0x%x", indicator);
4793 /* ------------------------------------------------------------------
4794 Dissector Parameter Network management controls
4797 dissect_isup_network_management_controls_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4800 indicator = tvb_get_guint8(parameter_tvb, 0);
4801 proto_tree_add_boolean(parameter_tree, hf_isup_temporary_alternative_routing_ind, parameter_tvb, 0,NETWORK_MANAGEMENT_CONTROLS_LENGTH, indicator);
4802 proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0,NETWORK_MANAGEMENT_CONTROLS_LENGTH, indicator);
4803 proto_item_set_text(parameter_item, "Network management controls: 0x%x", indicator);
4805 /* ------------------------------------------------------------------
4806 Dissector Parameter Correlation id - no detailed dissection since defined in Rec. Q.1281
4809 dissect_isup_correlation_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4810 { guint length = tvb_length(parameter_tvb);
4811 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Correlation ID (-> Q.1281)");
4812 proto_item_set_text(parameter_item, "Correlation ID, see Q.1281 (%u Byte%s)", length , plurality(length, "", "s"));
4814 /* ------------------------------------------------------------------
4815 Dissector Parameter SCF id - no detailed dissection since defined in Rec. Q.1281
4818 dissect_isup_scf_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4819 { guint length = tvb_length(parameter_tvb);
4820 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "SCF ID (-> Q.1281)");
4821 proto_item_set_text(parameter_item, "SCF ID, see Q.1281 (%u Byte%s)", length , plurality(length, "", "s"));
4823 /* ------------------------------------------------------------------
4824 Dissector Parameter Call diversion treatment indicators
4827 dissect_isup_call_diversion_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4830 indicator = tvb_get_guint8(parameter_tvb, 0);
4831 proto_tree_add_uint(parameter_tree, hf_isup_call_to_be_diverted_ind, parameter_tvb, 0,CALL_DIV_TREATMENT_IND_LENGTH, indicator);
4832 proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CALL_DIV_TREATMENT_IND_LENGTH, indicator);
4833 proto_item_set_text(parameter_item, "Call diversion treatment indicators: 0x%x", indicator);
4835 /* ------------------------------------------------------------------
4836 Dissector Parameter called IN number
4839 dissect_isup_called_in_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4841 proto_item *address_digits_item;
4842 proto_tree *address_digits_tree;
4843 guint8 indicators1, indicators2;
4844 guint8 address_digit_pair=0;
4848 char calling_number[MAXDIGITS + 1]="";
4850 indicators1 = tvb_get_guint8(parameter_tvb, 0);
4851 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
4852 proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
4853 indicators2 = tvb_get_guint8(parameter_tvb, 1);
4854 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
4855 proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
4858 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
4860 "Called IN Number");
4861 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
4863 length = tvb_length_remaining(parameter_tvb, offset);
4865 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
4866 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
4867 calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
4869 THROW(ReportedBoundsError);
4870 if ((length - 1) > 0 ){
4871 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
4872 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
4874 THROW(ReportedBoundsError);
4877 length = tvb_length_remaining(parameter_tvb, offset);
4880 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
4881 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
4882 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
4884 THROW(ReportedBoundsError);
4886 calling_number[i++] = '\0';
4888 proto_item_set_text(address_digits_item, "Called IN Number: %s", calling_number);
4889 proto_item_set_text(parameter_item, "Called IN Number: %s", calling_number);
4892 /* ------------------------------------------------------------------
4893 Dissector Parameter Call offering treatment indicators
4896 dissect_isup_call_offering_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4899 indicator = tvb_get_guint8(parameter_tvb, 0);
4900 proto_tree_add_uint(parameter_tree, hf_isup_call_to_be_offered_ind, parameter_tvb, 0,CALL_OFFERING_TREATMENT_IND_LENGTH, indicator);
4901 proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CALL_OFFERING_TREATMENT_IND_LENGTH, indicator);
4902 proto_item_set_text(parameter_item, "Call offering treatment indicators: 0x%x", indicator);
4904 /* ------------------------------------------------------------------
4905 Parameter Charged party identification
4908 dissect_isup_charged_party_identification_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4909 { guint length = tvb_length(parameter_tvb);
4910 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Charged party identification (format is national network specific)");
4911 proto_item_set_text(parameter_item, "Charged party identification (%u Byte%s)", length , plurality(length, "", "s"));
4913 /* ------------------------------------------------------------------
4914 Dissector Parameter Conference treatment indicators
4917 dissect_isup_conference_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4920 indicator = tvb_get_guint8(parameter_tvb, 0);
4921 proto_tree_add_uint(parameter_tree, hf_isup_conference_acceptance_ind, parameter_tvb, 0,CONFERENCE_TREATMENT_IND_LENGTH, indicator);
4922 proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CONFERENCE_TREATMENT_IND_LENGTH, indicator);
4923 proto_item_set_text(parameter_item, "Conference treatment indicators: 0x%x", indicator);
4925 /* ------------------------------------------------------------------
4926 Dissector Parameter Display information
4927 * TODO Output Display info :
4930 * The purpose of the Display information element is to supply display information
4931 * that may be displayed by the user. The information contained in this element is coded
4932 * in IA5 characters.
4933 * 8 7 6 5 4 3 2 1 Octet
4934 * 0 0 1 0 1 0 0 0 1 Display information element identifier
4935 * 2 Length of display contents
4936 * 0 3 Display information (IA5 characters)
4939 * Assuming octet 2 and onwards is pased here - just output text ?
4942 dissect_isup_display_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4943 { guint length = tvb_length(parameter_tvb);
4944 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length,
4945 "Display information (-> Q.931)");
4946 proto_item_set_text(parameter_item, "Display information (%u Byte%s)",
4947 length , plurality(length, "", "s"));
4949 /* ------------------------------------------------------------------
4950 Parameter UID action indicators
4953 dissect_isup_uid_action_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4956 indicator = tvb_get_guint8(parameter_tvb, 0);
4957 proto_tree_add_text(parameter_tree, parameter_tvb, 0,UID_ACTION_IND_LENGTH, "UID action indicators: 0x%x (refer to 3.78/Q.763 for detailed decoding)", indicator);
4958 proto_item_set_text(parameter_item, "UID action indicators: 0x%x", indicator);
4960 /* ------------------------------------------------------------------
4961 Parameter UID capability indicators
4964 dissect_isup_uid_capability_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4967 indicator = tvb_get_guint8(parameter_tvb, 0);
4968 proto_tree_add_text(parameter_tree, parameter_tvb, 0,UID_CAPABILITY_IND_LENGTH, "UID capability indicators: 0x%x (refer to 3.79/Q.763 for detailed decoding)", indicator);
4969 proto_item_set_text(parameter_item, "UID capability indicators: 0x%x", indicator);
4971 /* ------------------------------------------------------------------
4972 Parameter Redirect counter
4975 dissect_isup_redirect_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4976 { guint length = tvb_length(parameter_tvb);
4977 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Redirect counter (format is a national matter)");
4978 proto_item_set_text(parameter_item, "Redirect counter (%u Byte%s)", length , plurality(length, "", "s"));
4980 /* ------------------------------------------------------------------
4981 Dissector Parameter Collect call request
4984 dissect_isup_collect_call_request_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
4987 indicator = tvb_get_guint8(parameter_tvb, 0);
4988 if ((indicator & A_8BIT_MASK) == 0) {
4989 proto_tree_add_text(parameter_tree, parameter_tvb, 0, COLLECT_CALL_REQUEST_LENGTH, "Collect call request indicator: no indication");
4990 proto_item_set_text(parameter_item, "Collect call request: no indication (0x%x)", indicator);
4993 proto_tree_add_text(parameter_tree, parameter_tvb, 0, COLLECT_CALL_REQUEST_LENGTH, "Collect call request indicator: collect call requested");
4994 proto_item_set_text(parameter_item, "Collect call request: collect call requested (0x%x)", indicator);
4997 /* ------------------------------------------------------------------
4998 Dissector Parameter Calling geodetic location
5001 dissect_isup_calling_geodetic_location_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
5003 guint length = tvb_length(parameter_tvb);
5006 oct = tvb_get_guint8(parameter_tvb, 0);
5007 lpri = (oct & 0xc0) >> 2;
5009 proto_tree_add_uint(parameter_tree, hf_isup_geo_loc_presentation_restricted_ind, parameter_tvb, 0, 1, oct);
5010 proto_tree_add_uint(parameter_tree, hf_isup_geo_loc_screening_ind, parameter_tvb, 0, 1, oct);
5012 oct = tvb_get_guint8(parameter_tvb, 1);
5014 proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 1, 1, oct);
5015 proto_tree_add_text(parameter_tree, parameter_tvb, 1, 1,
5016 "Calling geodetic location type of shape: %s (%u)",
5017 val_to_str(oct & GFEDCBA_8BIT_MASK, isup_location_type_of_shape_value, "spare/reserved"), oct);
5023 proto_tree_add_text(parameter_tree, parameter_tvb, 2, length - 2,
5024 "Shape description");
5028 /* not supposed to have any data if 'lpri' was 'location not available' */
5030 proto_tree_add_text(parameter_tree, parameter_tvb, 2, length - 2,
5031 "Unknown (?), should not have data if LPRI is 'location not available'");
5035 proto_item_set_text(parameter_item, "Calling geodetic location");
5037 /* ------------------------------------------------------------------
5038 Dissector Parameter Generic number
5041 dissect_isup_generic_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
5043 proto_item *address_digits_item;
5044 proto_tree *address_digits_tree;
5045 guint8 indicators1, indicators2, nr_qualifier_ind;
5046 guint8 address_digit_pair=0;
5050 char calling_number[MAXDIGITS + 1]="";
5052 nr_qualifier_ind = tvb_get_guint8(parameter_tvb, 0);
5053 proto_tree_add_text(parameter_tree, parameter_tvb, 0, 1, "Number qualifier indicator: 0x%x (refer to 3.26/Q.763 for detailed decoding)", nr_qualifier_ind);
5054 indicators1 = tvb_get_guint8(parameter_tvb, 1);
5055 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 1, 1, indicators1);
5056 proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
5057 indicators2 = tvb_get_guint8(parameter_tvb, 2);
5058 proto_tree_add_boolean(parameter_tree, hf_isup_ni_indicator, parameter_tvb, 2, 1, indicators2);
5059 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 2, 1, indicators2);
5060 if ((indicators2 & GFE_8BIT_MASK) == 0x50)
5061 proto_tree_add_text(parameter_tree, parameter_tvb, 2, 1, "Different meaning for Generic Number: Numbering plan indicator = private numbering plan");
5062 proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 2, 1, indicators2);
5063 proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 2, 1, indicators2);
5066 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
5069 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
5071 length = tvb_length_remaining(parameter_tvb, offset);
5073 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
5074 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
5075 calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
5077 THROW(ReportedBoundsError);
5078 if ((length - 1) > 0 ){
5079 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
5080 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
5082 THROW(ReportedBoundsError);
5085 length = tvb_length_remaining(parameter_tvb, offset);
5088 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
5089 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
5090 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
5092 THROW(ReportedBoundsError);
5094 calling_number[i++] = '\0';
5097 * Indicators1 = Nature of address
5098 * Indicators2 = Number plan indicator
5100 indicators1 = indicators1 & 0x7f;
5101 indicators2 = (indicators2 & 0x70)>>4;
5102 if ((indicators1 == ISUP_CALLED_PARTY_NATURE_INTERNATNL_NR)&&(indicators2==ISDN_NUMBERING_PLAN))
5103 dissect_e164_cc(parameter_tvb, address_digits_tree, 3, TRUE);
5105 proto_item_set_text(address_digits_item, "Generic number: %s", calling_number);
5106 proto_item_set_text(parameter_item, "Generic number: %s", calling_number);
5109 /* ------------------------------------------------------------------
5110 Dissector Parameter Jurisdiction parameter
5113 dissect_isup_jurisdiction_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
5115 proto_item *address_digits_item;
5116 proto_tree *address_digits_tree;
5117 guint8 address_digit_pair=0;
5121 char called_number[MAXDIGITS + 1]="";
5125 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
5128 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
5130 while((length = tvb_reported_length_remaining(parameter_tvb, offset)) > 0){
5131 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
5132 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
5133 called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
5135 THROW(ReportedBoundsError);
5136 if ((length - 1) > 0 ){
5137 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
5138 called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
5140 THROW(ReportedBoundsError);
5145 if (tvb_length(parameter_tvb) > 0){
5146 proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
5147 called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
5149 THROW(ReportedBoundsError);
5151 called_number[i++] = '\0';
5153 proto_item_set_text(address_digits_item, "Jurisdiction: %s", called_number);
5154 proto_item_set_text(parameter_item, "Jurisdiction: %s", called_number);
5156 }/* ------------------------------------------------------------------
5157 Dissector Parameter Generic name
5160 dissect_isup_generic_name_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
5163 gint gen_name_length;
5164 char *gen_name=NULL;
5166 gen_name=ep_alloc(MAXGNAME + 1);
5168 gen_name_length = tvb_length(parameter_tvb) - 1;
5169 indicator = tvb_get_guint8(parameter_tvb, 0);
5170 proto_tree_add_uint(parameter_tree, hf_isup_generic_name_presentation, parameter_tvb, 1, 1, indicator);
5171 proto_tree_add_boolean(parameter_tree, hf_isup_generic_name_availability, parameter_tvb, 1, 1, indicator);
5172 proto_tree_add_uint(parameter_tree, hf_isup_generic_name_type, parameter_tvb, 1, 1, indicator);
5173 gen_name = tvb_get_ephemeral_string(parameter_tvb,1,gen_name_length);
5174 gen_name[gen_name_length] = '\0';
5175 proto_tree_add_string(parameter_tree, hf_isup_generic_name_ia5, parameter_tvb, 2, gen_name_length, gen_name);
5176 proto_item_set_text(parameter_item, "Generic name: %s", gen_name);
5180 /* ------------------------------------------------------------------
5181 Dissector Parameter Generic digits
5184 dissect_isup_generic_digits_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
5185 { guint length = tvb_length(parameter_tvb);
5186 proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Generic digits (refer to 3.24/Q.673 for detailed decoding)");
5187 proto_item_set_text(parameter_item, "Generic digits (%u Byte%s)", length , plurality(length, "", "s"));
5190 /* ------------------------------------------------------------------
5191 Dissector Parameter Charge number
5194 dissect_isup_charge_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
5196 proto_item *address_digits_item;
5197 proto_tree *address_digits_tree;
5198 guint8 indicators1, indicators2;
5199 guint8 address_digit_pair=0;
5203 char calling_number[MAXDIGITS + 1]="";
5205 indicators1 = tvb_get_guint8(parameter_tvb, 0);
5206 proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
5207 proto_tree_add_uint(parameter_tree, hf_isup_charge_number_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
5208 indicators2 = tvb_get_guint8(parameter_tvb, 1);
5209 proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
5212 address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
5215 address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
5217 length = tvb_length_remaining(parameter_tvb, offset);
5219 address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
5220 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
5221 calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
5223 THROW(ReportedBoundsError);
5224 if ((length - 1) > 0 ){
5225 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
5226 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
5228 THROW(ReportedBoundsError);
5231 length = tvb_length_remaining(parameter_tvb, offset);
5234 if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
5235 proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
5236 calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
5238 THROW(ReportedBoundsError);
5240 calling_number[i++] = '\0';
5242 proto_item_set_text(address_digits_item, "Charge Number: %s", calling_number);
5243 proto_item_set_text(parameter_item, "Charge Number: %s", calling_number);
5246 /* ------------------------------------------------------------------ */
5248 dissect_isup_unknown_parameter(tvbuff_t *parameter_tvb, proto_item *parameter_item)
5249 { guint length = tvb_length(parameter_tvb);
5250 proto_item_set_text(parameter_item, "Parameter Type unknown/reserved (%u Byte%s)", length , plurality(length, "", "s"));
5252 /* ------------------------------------------------------------------ */
5254 /* ------------------------------------------------------------------
5255 Dissector all optional parameters
5258 dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb,packet_info *pinfo, proto_tree *isup_tree)
5259 { proto_item* parameter_item;
5260 proto_tree* parameter_tree;
5262 guint parameter_type, parameter_length, actual_length;
5263 tvbuff_t *parameter_tvb;
5266 /* Dissect all optional parameters while end of message isn't reached */
5267 parameter_type = 0xFF; /* Start-initializiation since parameter_type is used for while-condition */
5269 while ((tvb_length_remaining(optional_parameters_tvb, offset) >= 1) && (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS)){
5270 parameter_type = tvb_get_guint8(optional_parameters_tvb, offset);
5272 if (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS){
5273 parameter_length = tvb_get_guint8(optional_parameters_tvb, offset + PARAMETER_TYPE_LENGTH);
5275 parameter_item = proto_tree_add_text(isup_tree, optional_parameters_tvb,
5277 parameter_length + PARAMETER_TYPE_LENGTH + PARAMETER_LENGTH_IND_LENGTH,
5278 "Parameter: type %u",
5280 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
5281 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, optional_parameters_tvb, offset, PARAMETER_TYPE_LENGTH, parameter_type, "Optional Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
5282 offset += PARAMETER_TYPE_LENGTH;
5284 octet = tvb_get_guint8(optional_parameters_tvb,offset);
5286 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, optional_parameters_tvb, offset, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
5287 offset += PARAMETER_LENGTH_IND_LENGTH;
5291 actual_length = tvb_length_remaining(optional_parameters_tvb, offset);
5292 if (actual_length > 0){
5293 parameter_tvb = tvb_new_subset(optional_parameters_tvb, offset, MIN(parameter_length, actual_length), parameter_length);
5294 switch (parameter_type) {
5295 case PARAM_TYPE_CALL_REF:
5296 dissect_isup_call_reference_parameter(parameter_tvb, parameter_tree, parameter_item);
5298 case PARAM_TYPE_TRANSM_MEDIUM_REQU:
5299 dissect_isup_transmission_medium_requirement_parameter(parameter_tvb, parameter_tree, parameter_item);
5301 case PARAM_TYPE_ACC_TRANSP:
5302 dissect_isup_access_transport_parameter(parameter_tvb, parameter_tree, parameter_item, pinfo);
5304 case PARAM_TYPE_CALLED_PARTY_NR:
5305 dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5307 case PARAM_TYPE_SUBSQT_NR:
5308 dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5310 case PARAM_TYPE_NATURE_OF_CONN_IND:
5311 dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5313 case PARAM_TYPE_FORW_CALL_IND:
5314 dissect_isup_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5316 case PARAM_TYPE_OPT_FORW_CALL_IND:
5317 dissect_isup_optional_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5319 case PARAM_TYPE_CALLING_PRTY_CATEG:
5320 dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item);
5322 case PARAM_TYPE_CALLING_PARTY_NR:
5323 dissect_isup_calling_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5325 case PARAM_TYPE_REDIRECTING_NR:
5326 dissect_isup_redirecting_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5328 case PARAM_TYPE_REDIRECTION_NR:
5329 dissect_isup_redirection_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5331 case PARAM_TYPE_CONNECTION_REQ:
5332 dissect_isup_connection_request_parameter(parameter_tvb, parameter_tree, parameter_item);
5334 case PARAM_TYPE_INFO_REQ_IND:
5335 dissect_isup_information_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5337 case PARAM_TYPE_INFO_IND:
5338 dissect_isup_information_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5340 case PARAM_TYPE_CONTINUITY_IND:
5341 dissect_isup_continuity_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5343 case PARAM_TYPE_BACKW_CALL_IND:
5344 dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5346 case PARAM_TYPE_CAUSE_INDICATORS:
5347 dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5349 case PARAM_TYPE_REDIRECTION_INFO:
5350 dissect_isup_redirection_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5352 case PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE:
5353 dissect_isup_circuit_group_supervision_message_type_parameter(parameter_tvb, parameter_tree, parameter_item);
5355 case PARAM_TYPE_RANGE_AND_STATUS:
5356 dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
5358 case PARAM_TYPE_FACILITY_IND:
5359 dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
5361 case PARAM_TYPE_CLSD_USR_GRP_ILOCK_CD:
5362 dissect_isup_closed_user_group_interlock_code_parameter(parameter_tvb, parameter_tree, parameter_item);
5364 case PARAM_TYPE_USER_SERVICE_INFO:
5365 dissect_isup_user_service_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5367 case PARAM_TYPE_SIGNALLING_POINT_CODE:
5368 dissect_isup_signalling_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
5370 case PARAM_TYPE_USER_TO_USER_INFO:
5371 dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5373 case PARAM_TYPE_CONNECTED_NR:
5374 dissect_isup_connected_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5376 case PARAM_TYPE_SUSP_RESUME_IND:
5377 dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5379 case PARAM_TYPE_TRANSIT_NETW_SELECT:
5380 dissect_isup_transit_network_selection_parameter(parameter_tvb, parameter_tree, parameter_item);
5382 case PARAM_TYPE_EVENT_INFO:
5383 dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5385 case PARAM_TYPE_CIRC_ASSIGN_MAP:
5386 dissect_isup_circuit_assignment_map_parameter(parameter_tvb, parameter_tree, parameter_item);
5388 case PARAM_TYPE_CIRC_STATE_IND:
5389 dissect_isup_circuit_state_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
5391 case PARAM_TYPE_AUTO_CONG_LEVEL:
5392 dissect_isup_automatic_congestion_level_parameter(parameter_tvb, parameter_tree, parameter_item);
5394 case PARAM_TYPE_ORIG_CALLED_NR:
5395 dissect_isup_original_called_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5397 case PARAM_TYPE_OPT_BACKW_CALL_IND:
5398 dissect_isup_optional_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5400 case PARAM_TYPE_USER_TO_USER_IND:
5401 dissect_isup_user_to_user_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5403 case PARAM_TYPE_ORIG_ISC_POINT_CODE:
5404 dissect_isup_original_isc_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
5406 case PARAM_TYPE_GENERIC_NOTIF_IND:
5407 dissect_isup_generic_notification_indicator_parameter(parameter_tvb, parameter_tree, parameter_item);
5409 case PARAM_TYPE_CALL_HIST_INFO :
5410 dissect_isup_call_history_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5412 case PARAM_TYPE_ACC_DELIV_INFO:
5413 dissect_isup_access_delivery_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5415 case PARAM_TYPE_NETW_SPECIFIC_FACLTY:
5416 dissect_isup_network_specific_facility_parameter(parameter_tvb, parameter_tree, parameter_item);
5418 case PARAM_TYPE_USER_SERVICE_INFO_PR:
5419 dissect_isup_user_service_information_prime_parameter(parameter_tvb, parameter_tree, parameter_item);
5421 case PARAM_TYPE_PROPAG_DELAY_COUNTER:
5422 dissect_isup_propagation_delay_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
5424 case PARAM_TYPE_REMOTE_OPERATIONS:
5425 dissect_isup_remote_operations_parameter(parameter_tvb, parameter_tree, parameter_item);
5427 case PARAM_TYPE_SERVICE_ACTIVATION:
5428 dissect_isup_service_activation_parameter(parameter_tvb, parameter_tree, parameter_item);
5430 case PARAM_TYPE_USER_TELESERV_INFO:
5431 dissect_isup_user_teleservice_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5433 case PARAM_TYPE_TRANSM_MEDIUM_USED:
5434 dissect_isup_transmission_medium_used_parameter(parameter_tvb, parameter_tree, parameter_item);
5436 case PARAM_TYPE_CALL_DIV_INFO:
5437 dissect_isup_call_diversion_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5439 case PARAM_TYPE_ECHO_CTRL_INFO:
5440 dissect_isup_echo_control_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5442 case PARAM_TYPE_MSG_COMPAT_INFO:
5443 dissect_isup_message_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5445 case PARAM_TYPE_PARAM_COMPAT_INFO:
5446 dissect_isup_parameter_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5448 case PARAM_TYPE_MLPP_PRECEDENCE:
5449 dissect_isup_mlpp_precedence_parameter(parameter_tvb, parameter_tree, parameter_item);
5451 case PARAM_TYPE_MCID_REQ_IND:
5452 dissect_isup_mcid_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5454 case PARAM_TYPE_MCID_RSP_IND:
5455 dissect_isup_mcid_response_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5457 case PARAM_TYPE_HOP_COUNTER:
5458 dissect_isup_hop_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
5460 case PARAM_TYPE_TRANSM_MEDIUM_RQUR_PR:
5461 dissect_isup_transmission_medium_requirement_prime_parameter(parameter_tvb, parameter_tree, parameter_item);
5463 case PARAM_TYPE_LOCATION_NR:
5464 dissect_isup_location_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5466 case PARAM_TYPE_REDIR_NR_RSTRCT:
5467 dissect_isup_redirection_number_restriction_parameter(parameter_tvb, parameter_tree, parameter_item);
5469 case PARAM_TYPE_CALL_TRANS_REF:
5470 dissect_isup_call_transfer_reference_parameter(parameter_tvb, parameter_tree, parameter_item);
5472 case PARAM_TYPE_LOOP_PREV_IND:
5473 dissect_isup_loop_prevention_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5475 case PARAM_TYPE_CALL_TRANS_NR:
5476 dissect_isup_call_transfer_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5478 case PARAM_TYPE_CCSS:
5479 dissect_isup_ccss_parameter(parameter_tvb, parameter_tree, parameter_item);
5481 case PARAM_TYPE_FORW_GVNS:
5482 dissect_isup_forward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);
5484 case PARAM_TYPE_BACKW_GVNS:
5485 dissect_isup_backward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);
5487 case PARAM_TYPE_REDIRECT_CAPAB:
5488 dissect_isup_redirect_capability_parameter(parameter_tvb, parameter_tree, parameter_item);
5490 case PARAM_TYPE_NETW_MGMT_CTRL:
5491 dissect_isup_network_management_controls_parameter(parameter_tvb, parameter_tree, parameter_item);
5493 case PARAM_TYPE_CORRELATION_ID:
5494 dissect_isup_correlation_id_parameter(parameter_tvb, parameter_tree, parameter_item);
5496 case PARAM_TYPE_SCF_ID:
5497 dissect_isup_scf_id_parameter(parameter_tvb, parameter_tree, parameter_item);
5499 case PARAM_TYPE_CALL_DIV_TREAT_IND:
5500 dissect_isup_call_diversion_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5502 case PARAM_TYPE_CALLED_IN_NR:
5503 dissect_isup_called_in_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5505 case PARAM_TYPE_CALL_OFF_TREAT_IND:
5506 dissect_isup_call_offering_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5508 case PARAM_TYPE_CHARGED_PARTY_IDENT:
5509 dissect_isup_charged_party_identification_parameter(parameter_tvb, parameter_tree, parameter_item);
5511 case PARAM_TYPE_CONF_TREAT_IND:
5512 dissect_isup_conference_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5514 case PARAM_TYPE_DISPLAY_INFO:
5515 dissect_isup_display_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5517 case PARAM_TYPE_UID_ACTION_IND:
5518 dissect_isup_uid_action_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5520 case PARAM_TYPE_UID_CAPAB_IND:
5521 dissect_isup_uid_capability_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5523 case PARAM_TYPE_REDIRECT_COUNTER:
5524 dissect_isup_redirect_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
5526 case PARAM_TYPE_COLLECT_CALL_REQ:
5527 dissect_isup_collect_call_request_parameter(parameter_tvb, parameter_tree, parameter_item);
5529 case PARAM_TYPE_GENERIC_NR:
5530 dissect_isup_generic_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5532 case PARAM_TYPE_GENERIC_DIGITS:
5533 dissect_isup_generic_digits_parameter(parameter_tvb, parameter_tree, parameter_item);
5535 case PARAM_TYPE_APPLICATON_TRANS:
5536 dissect_isup_application_transport_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item);
5540 dissect_isup_unknown_parameter(parameter_tvb, parameter_item);
5545 offset += MIN(parameter_length, actual_length);
5550 /* End of optional parameters is reached */
5551 proto_tree_add_uint_format(isup_tree, hf_isup_parameter_type, optional_parameters_tvb , offset, PARAMETER_TYPE_LENGTH, parameter_type, "End of optional parameters (%u)", parameter_type);
5556 /* ------------------------------------------------------------------
5557 Dissector all ANSI optional parameters
5558 TODO: Actullay make this dissect ANSI :) - It's still plain old ITU for now
5561 dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb,packet_info *pinfo, proto_tree *isup_tree)
5562 { proto_item* parameter_item;
5563 proto_tree* parameter_tree;
5565 guint parameter_type, parameter_length, actual_length;
5566 tvbuff_t *parameter_tvb;
5569 /* Dissect all optional parameters while end of message isn't reached */
5570 parameter_type = 0xFF; /* Start-initializiation since parameter_type is used for while-condition */
5572 while ((tvb_length_remaining(optional_parameters_tvb, offset) >= 1) && (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS)){
5573 parameter_type = tvb_get_guint8(optional_parameters_tvb, offset);
5575 if (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS){
5576 parameter_length = tvb_get_guint8(optional_parameters_tvb, offset + PARAMETER_TYPE_LENGTH);
5578 parameter_item = proto_tree_add_text(isup_tree, optional_parameters_tvb,
5580 parameter_length + PARAMETER_TYPE_LENGTH + PARAMETER_LENGTH_IND_LENGTH,
5581 "Parameter: type %u",
5583 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
5584 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, optional_parameters_tvb, offset, PARAMETER_TYPE_LENGTH, parameter_type, "Optional Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, ansi_isup_parameter_type_value,"unknown"));
5585 offset += PARAMETER_TYPE_LENGTH;
5587 octet = tvb_get_guint8(optional_parameters_tvb,offset);
5589 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, optional_parameters_tvb, offset, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
5590 offset += PARAMETER_LENGTH_IND_LENGTH;
5594 actual_length = tvb_length_remaining(optional_parameters_tvb, offset);
5595 if (actual_length > 0){
5596 parameter_tvb = tvb_new_subset(optional_parameters_tvb, offset, MIN(parameter_length, actual_length), parameter_length);
5597 switch (parameter_type) {
5598 case PARAM_TYPE_CALL_REF:
5599 dissect_isup_call_reference_parameter(parameter_tvb, parameter_tree, parameter_item);
5601 case PARAM_TYPE_TRANSM_MEDIUM_REQU:
5602 dissect_isup_transmission_medium_requirement_parameter(parameter_tvb, parameter_tree, parameter_item);
5604 case PARAM_TYPE_ACC_TRANSP:
5605 dissect_isup_access_transport_parameter(parameter_tvb, parameter_tree, parameter_item, pinfo);
5607 case PARAM_TYPE_CALLED_PARTY_NR:
5608 dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5610 case PARAM_TYPE_SUBSQT_NR:
5611 dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5613 case PARAM_TYPE_NATURE_OF_CONN_IND:
5614 dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5616 case PARAM_TYPE_FORW_CALL_IND:
5617 dissect_isup_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5619 case PARAM_TYPE_OPT_FORW_CALL_IND:
5620 dissect_isup_optional_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5622 case PARAM_TYPE_CALLING_PRTY_CATEG:
5623 dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item);
5625 case PARAM_TYPE_CALLING_PARTY_NR:
5626 dissect_isup_calling_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5628 case PARAM_TYPE_REDIRECTING_NR:
5629 dissect_isup_redirecting_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5631 case PARAM_TYPE_REDIRECTION_NR:
5632 dissect_isup_redirection_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5634 case PARAM_TYPE_CONNECTION_REQ:
5635 dissect_isup_connection_request_parameter(parameter_tvb, parameter_tree, parameter_item);
5637 case PARAM_TYPE_INFO_REQ_IND:
5638 dissect_isup_information_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5640 case PARAM_TYPE_INFO_IND:
5641 dissect_isup_information_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5643 case PARAM_TYPE_CONTINUITY_IND:
5644 dissect_isup_continuity_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5646 case PARAM_TYPE_BACKW_CALL_IND:
5647 dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5649 case PARAM_TYPE_CAUSE_INDICATORS:
5650 dissect_ansi_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5652 case PARAM_TYPE_REDIRECTION_INFO:
5653 dissect_isup_redirection_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5655 case PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE:
5656 dissect_isup_circuit_group_supervision_message_type_parameter(parameter_tvb, parameter_tree, parameter_item);
5658 case PARAM_TYPE_RANGE_AND_STATUS:
5659 dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
5661 case PARAM_TYPE_FACILITY_IND:
5662 dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
5664 case PARAM_TYPE_CLSD_USR_GRP_ILOCK_CD:
5665 dissect_isup_closed_user_group_interlock_code_parameter(parameter_tvb, parameter_tree, parameter_item);
5667 case PARAM_TYPE_USER_SERVICE_INFO:
5668 dissect_isup_user_service_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5670 case PARAM_TYPE_SIGNALLING_POINT_CODE:
5671 dissect_isup_signalling_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
5673 case PARAM_TYPE_USER_TO_USER_INFO:
5674 dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5676 case PARAM_TYPE_CONNECTED_NR:
5677 dissect_isup_connected_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5679 case PARAM_TYPE_SUSP_RESUME_IND:
5680 dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5682 case PARAM_TYPE_TRANSIT_NETW_SELECT:
5683 dissect_isup_transit_network_selection_parameter(parameter_tvb, parameter_tree, parameter_item);
5685 case PARAM_TYPE_EVENT_INFO:
5686 dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5688 case PARAM_TYPE_CIRC_ASSIGN_MAP:
5689 dissect_isup_circuit_assignment_map_parameter(parameter_tvb, parameter_tree, parameter_item);
5691 case PARAM_TYPE_CIRC_STATE_IND:
5692 dissect_isup_circuit_state_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
5694 case PARAM_TYPE_AUTO_CONG_LEVEL:
5695 dissect_isup_automatic_congestion_level_parameter(parameter_tvb, parameter_tree, parameter_item);
5697 case PARAM_TYPE_ORIG_CALLED_NR:
5698 dissect_isup_original_called_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5700 case PARAM_TYPE_OPT_BACKW_CALL_IND:
5701 dissect_isup_optional_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5703 case PARAM_TYPE_USER_TO_USER_IND:
5704 dissect_isup_user_to_user_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5706 case PARAM_TYPE_ORIG_ISC_POINT_CODE:
5707 dissect_isup_original_isc_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
5709 case PARAM_TYPE_GENERIC_NOTIF_IND:
5710 dissect_isup_generic_notification_indicator_parameter(parameter_tvb, parameter_tree, parameter_item);
5712 case PARAM_TYPE_CALL_HIST_INFO :
5713 dissect_isup_call_history_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5715 case PARAM_TYPE_ACC_DELIV_INFO:
5716 dissect_isup_access_delivery_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5718 case PARAM_TYPE_NETW_SPECIFIC_FACLTY:
5719 dissect_isup_network_specific_facility_parameter(parameter_tvb, parameter_tree, parameter_item);
5721 case PARAM_TYPE_USER_SERVICE_INFO_PR:
5722 dissect_isup_user_service_information_prime_parameter(parameter_tvb, parameter_tree, parameter_item);
5724 case PARAM_TYPE_PROPAG_DELAY_COUNTER:
5725 dissect_isup_propagation_delay_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
5727 case PARAM_TYPE_REMOTE_OPERATIONS:
5728 dissect_isup_remote_operations_parameter(parameter_tvb, parameter_tree, parameter_item);
5730 case PARAM_TYPE_SERVICE_ACTIVATION:
5731 dissect_isup_service_activation_parameter(parameter_tvb, parameter_tree, parameter_item);
5733 case PARAM_TYPE_USER_TELESERV_INFO:
5734 dissect_isup_user_teleservice_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5736 case PARAM_TYPE_TRANSM_MEDIUM_USED:
5737 dissect_isup_transmission_medium_used_parameter(parameter_tvb, parameter_tree, parameter_item);
5739 case PARAM_TYPE_CALL_DIV_INFO:
5740 dissect_isup_call_diversion_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5742 case PARAM_TYPE_ECHO_CTRL_INFO:
5743 dissect_isup_echo_control_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5745 case PARAM_TYPE_MSG_COMPAT_INFO:
5746 dissect_isup_message_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5748 case PARAM_TYPE_PARAM_COMPAT_INFO:
5749 dissect_isup_parameter_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5751 case PARAM_TYPE_MLPP_PRECEDENCE:
5752 dissect_isup_mlpp_precedence_parameter(parameter_tvb, parameter_tree, parameter_item);
5754 case PARAM_TYPE_MCID_REQ_IND:
5755 dissect_isup_mcid_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5757 case PARAM_TYPE_MCID_RSP_IND:
5758 dissect_isup_mcid_response_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5760 case PARAM_TYPE_HOP_COUNTER:
5761 dissect_isup_hop_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
5763 case PARAM_TYPE_ORIG_LINE_INFO:
5764 dissect_isup_orig_line_info_parameter(parameter_tvb, parameter_tree, parameter_item);
5766 case PARAM_TYPE_TRANSM_MEDIUM_RQUR_PR:
5767 dissect_isup_transmission_medium_requirement_prime_parameter(parameter_tvb, parameter_tree, parameter_item);
5769 case PARAM_TYPE_LOCATION_NR:
5770 dissect_isup_location_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5772 case PARAM_TYPE_REDIR_NR_RSTRCT:
5773 dissect_isup_redirection_number_restriction_parameter(parameter_tvb, parameter_tree, parameter_item);
5775 case PARAM_TYPE_CALL_TRANS_REF:
5776 dissect_isup_call_transfer_reference_parameter(parameter_tvb, parameter_tree, parameter_item);
5778 case PARAM_TYPE_LOOP_PREV_IND:
5779 dissect_isup_loop_prevention_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5781 case PARAM_TYPE_CALL_TRANS_NR:
5782 dissect_isup_call_transfer_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5784 case PARAM_TYPE_CCSS:
5785 dissect_isup_ccss_parameter(parameter_tvb, parameter_tree, parameter_item);
5787 case PARAM_TYPE_FORW_GVNS:
5788 dissect_isup_forward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);
5790 case PARAM_TYPE_BACKW_GVNS:
5791 dissect_isup_backward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);
5793 case PARAM_TYPE_REDIRECT_CAPAB:
5794 dissect_isup_redirect_capability_parameter(parameter_tvb, parameter_tree, parameter_item);
5796 case PARAM_TYPE_NETW_MGMT_CTRL:
5797 dissect_isup_network_management_controls_parameter(parameter_tvb, parameter_tree, parameter_item);
5799 case PARAM_TYPE_CORRELATION_ID:
5800 dissect_isup_correlation_id_parameter(parameter_tvb, parameter_tree, parameter_item);
5802 case PARAM_TYPE_SCF_ID:
5803 dissect_isup_scf_id_parameter(parameter_tvb, parameter_tree, parameter_item);
5805 case PARAM_TYPE_CALL_DIV_TREAT_IND:
5806 dissect_isup_call_diversion_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5808 case PARAM_TYPE_CALLED_IN_NR:
5809 dissect_isup_called_in_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5811 case PARAM_TYPE_CALL_OFF_TREAT_IND:
5812 dissect_isup_call_offering_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5814 case PARAM_TYPE_CHARGED_PARTY_IDENT:
5815 dissect_isup_charged_party_identification_parameter(parameter_tvb, parameter_tree, parameter_item);
5817 case PARAM_TYPE_CONF_TREAT_IND:
5818 dissect_isup_conference_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5820 case PARAM_TYPE_DISPLAY_INFO:
5821 dissect_isup_display_information_parameter(parameter_tvb, parameter_tree, parameter_item);
5823 case PARAM_TYPE_UID_ACTION_IND:
5824 dissect_isup_uid_action_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5826 case PARAM_TYPE_UID_CAPAB_IND:
5827 dissect_isup_uid_capability_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5829 case PARAM_TYPE_REDIRECT_COUNTER:
5830 dissect_isup_redirect_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
5832 case PARAM_TYPE_COLLECT_CALL_REQ:
5833 dissect_isup_collect_call_request_parameter(parameter_tvb, parameter_tree, parameter_item);
5835 case PARAM_TYPE_CALLING_GEODETIC_LOCATION:
5836 dissect_isup_calling_geodetic_location_parameter(parameter_tvb, parameter_tree, parameter_item);
5838 case PARAM_TYPE_GENERIC_NR:
5839 dissect_isup_generic_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5841 case PARAM_TYPE_JURISDICTION:
5842 dissect_isup_jurisdiction_parameter(parameter_tvb, parameter_tree, parameter_item);
5844 case PARAM_TYPE_GENERIC_NAME:
5845 dissect_isup_generic_name_parameter(parameter_tvb, parameter_tree, parameter_item);
5847 case PARAM_TYPE_GENERIC_DIGITS:
5848 dissect_isup_generic_digits_parameter(parameter_tvb, parameter_tree, parameter_item);
5850 case PARAM_TYPE_CHARGE_NR:
5851 dissect_isup_charge_number_parameter(parameter_tvb, parameter_tree, parameter_item);
5853 case PARAM_TYPE_APPLICATON_TRANS:
5854 dissect_isup_application_transport_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item);
5858 dissect_isup_unknown_parameter(parameter_tvb, parameter_item);
5863 offset += MIN(parameter_length, actual_length);
5868 /* End of optional parameters is reached */
5869 proto_tree_add_uint_format(isup_tree, hf_isup_parameter_type, optional_parameters_tvb , offset, PARAMETER_TYPE_LENGTH, parameter_type, "End of optional parameters (%u)", parameter_type);
5873 /* ------------------------------------------------------------------ */
5874 /* Dissectors for all used message types */
5875 /* Called by dissect_isup_message(), */
5876 /* call parameter dissectors in order of mandatory parameters */
5877 /* (since not labeled) */
5878 /* ------------------------------------------------------------------
5879 Dissector Message Type Circuit Validation Test Response
5882 dissect_ansi_isup_circuit_validation_test_resp_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
5884 proto_item* parameter_item;
5885 proto_tree* parameter_tree;
5886 tvbuff_t *parameter_tvb;
5888 gint parameter_type,actual_length;
5890 /* Do stuff for first mandatory fixed parameter: CVR Repsonse Indicator */
5891 parameter_type = ANSI_ISUP_PARAM_TYPE_CVR_RESP_IND;
5892 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset, CVR_RESP_IND_LENGTH, "CVR Response Indicator");
5894 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
5895 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"CVR Response Indicator"));
5897 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
5899 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CVR_RESP_IND_LENGTH, actual_length), CVR_RESP_IND_LENGTH);
5900 dissect_isup_cvr_response_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
5901 offset += CVR_RESP_IND_LENGTH;
5903 /* Do stuff for second mandatory fixed parameter: CG Characteristics Indicator */
5904 parameter_type = ANSI_ISUP_PARAM_TYPE_CG_CHAR_IND;
5905 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
5907 "Circuit Group Characteristics Indicators");
5908 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
5909 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"Circuit Group Characters"));
5910 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
5911 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CG_CHAR_IND_LENGTH, actual_length), CG_CHAR_IND_LENGTH);
5912 dissect_isup_circuit_group_char_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
5913 offset += CG_CHAR_IND_LENGTH;
5917 /* ------------------------------------------------------------------
5918 Dissector Message Type Circuit Reservation
5921 dissect_ansi_isup_circuit_reservation_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
5922 { proto_item* parameter_item;
5923 proto_tree* parameter_tree;
5924 tvbuff_t *parameter_tvb;
5926 gint parameter_type, actual_length;
5928 /* Do stuff for mandatory fixed parameter: Nature of Connection Indicators */
5929 parameter_type = PARAM_TYPE_NATURE_OF_CONN_IND;
5930 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
5931 NATURE_OF_CONNECTION_IND_LENGTH,
5932 "Nature of Connection Indicators");
5933 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
5934 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
5935 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
5936 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(NATURE_OF_CONNECTION_IND_LENGTH, actual_length), NATURE_OF_CONNECTION_IND_LENGTH);
5937 dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5938 offset += NATURE_OF_CONNECTION_IND_LENGTH;
5942 /* ------------------------------------------------------------------
5943 Dissector Message Type Initial address message
5946 dissect_isup_initial_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
5947 { proto_item* parameter_item;
5948 proto_tree* parameter_tree;
5949 tvbuff_t *parameter_tvb;
5951 gint parameter_type, parameter_pointer, parameter_length, actual_length;
5953 /* Do stuff for first mandatory fixed parameter: Nature of Connection Indicators */
5954 parameter_type = PARAM_TYPE_NATURE_OF_CONN_IND;
5955 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
5956 NATURE_OF_CONNECTION_IND_LENGTH,
5957 "Nature of Connection Indicators");
5958 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
5959 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
5960 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
5961 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(NATURE_OF_CONNECTION_IND_LENGTH, actual_length), NATURE_OF_CONNECTION_IND_LENGTH);
5962 dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5963 offset += NATURE_OF_CONNECTION_IND_LENGTH;
5965 /* Do stuff for 2nd mandatory fixed parameter: Forward Call Indicators */
5966 parameter_type = PARAM_TYPE_FORW_CALL_IND;
5967 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
5968 FORWARD_CALL_IND_LENGTH,
5969 "Forward Call Indicators");
5970 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
5971 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
5972 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
5973 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FORWARD_CALL_IND_LENGTH, actual_length), FORWARD_CALL_IND_LENGTH );
5974 dissect_isup_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
5975 offset += FORWARD_CALL_IND_LENGTH;
5977 /* Do stuff for 3nd mandatory fixed parameter: Calling party's category */
5978 parameter_type = PARAM_TYPE_CALLING_PRTY_CATEG;
5979 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
5980 CALLING_PRTYS_CATEGORY_LENGTH,
5981 "Calling Party's category");
5982 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
5983 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
5984 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
5985 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CALLING_PRTYS_CATEGORY_LENGTH, actual_length),CALLING_PRTYS_CATEGORY_LENGTH );
5986 dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item);
5987 offset += CALLING_PRTYS_CATEGORY_LENGTH;
5989 switch (isup_standard){
5991 /* If ITU, do stuff for 4th mandatory fixed parameter: Transmission medium requirement */
5992 parameter_type = PARAM_TYPE_TRANSM_MEDIUM_REQU;
5993 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
5994 TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH,
5995 "Transmission medium requirement");
5996 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
5997 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
5998 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
5999 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH, actual_length), TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH);
6000 dissect_isup_transmission_medium_requirement_parameter(parameter_tvb, parameter_tree, parameter_item);
6001 offset += TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH;
6004 /* If ANSI, do stuff for the first mandatory variable parameter, USER_SERVICE_INFORMATION */
6005 parameter_type = PARAM_TYPE_USER_SERVICE_INFO;
6006 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6007 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6008 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6009 offset + parameter_pointer,
6010 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6011 "User Service Information");
6012 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6013 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6014 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6015 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6016 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6017 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6018 dissect_isup_user_service_information_parameter(parameter_tvb, parameter_tree, parameter_item);
6019 offset += PARAMETER_POINTER_LENGTH;
6023 /* Do stuff for mandatory variable parameter Called party number */
6024 parameter_type = PARAM_TYPE_CALLED_PARTY_NR;
6025 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6026 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6028 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6029 offset + parameter_pointer,
6030 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6031 "Called Party Number");
6032 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6033 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6034 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6035 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6036 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6037 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6038 dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
6039 offset += PARAMETER_POINTER_LENGTH;
6043 /* ------------------------------------------------------------------
6044 Dissector Message Type subsequent address message
6046 static gint dissect_isup_subsequent_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6047 { proto_item* parameter_item;
6048 proto_tree* parameter_tree;
6049 tvbuff_t *parameter_tvb;
6051 gint parameter_type, parameter_pointer, parameter_length, actual_length;
6053 /* Do stuff for mandatory variable parameter Subsequent number */
6054 parameter_type = PARAM_TYPE_SUBSQT_NR;
6056 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6057 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6059 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6060 offset + parameter_pointer,
6061 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6062 "Subsequent Number");
6063 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6064 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6065 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6066 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6067 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6068 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6069 dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item);
6070 offset += PARAMETER_POINTER_LENGTH;
6075 /* ------------------------------------------------------------------
6076 Dissector Message Type Information request message
6079 dissect_isup_information_request_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6080 { proto_item* parameter_item;
6081 proto_tree* parameter_tree;
6082 tvbuff_t *parameter_tvb;
6084 gint parameter_type, actual_length;
6086 /* Do stuff for first mandatory fixed parameter: Information request indicators*/
6087 parameter_type = PARAM_TYPE_INFO_REQ_IND;
6088 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6089 INFO_REQUEST_IND_LENGTH,
6090 "Information request indicators");
6091 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6092 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6093 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6094 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(INFO_REQUEST_IND_LENGTH, actual_length), INFO_REQUEST_IND_LENGTH);
6095 dissect_isup_information_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6096 offset += INFO_REQUEST_IND_LENGTH;
6099 /* ------------------------------------------------------------------
6100 Dissector Message Type Information
6103 dissect_isup_information_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6104 { proto_item* parameter_item;
6105 proto_tree* parameter_tree;
6106 tvbuff_t *parameter_tvb;
6108 gint parameter_type, actual_length;
6110 /* Do stuff for first mandatory fixed parameter: Information indicators*/
6111 parameter_type = PARAM_TYPE_INFO_IND;
6112 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6114 "Information indicators");
6115 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6116 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6117 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6118 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(INFO_IND_LENGTH, actual_length), INFO_IND_LENGTH);
6119 dissect_isup_information_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6120 offset += INFO_IND_LENGTH;
6123 /* ------------------------------------------------------------------
6124 Dissector Message Type Continuity
6127 dissect_isup_continuity_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6128 { proto_item* parameter_item;
6129 proto_tree* parameter_tree;
6130 tvbuff_t *parameter_tvb;
6132 gint parameter_type, actual_length;
6134 /* Do stuff for first mandatory fixed parameter: Continuity indicators*/
6135 parameter_type = PARAM_TYPE_CONTINUITY_IND;
6136 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6137 CONTINUITY_IND_LENGTH,
6138 "Continuity indicators");
6139 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6140 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6141 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6142 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CONTINUITY_IND_LENGTH, actual_length), CONTINUITY_IND_LENGTH);
6143 dissect_isup_continuity_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6144 offset += CONTINUITY_IND_LENGTH;
6147 /* ------------------------------------------------------------------
6148 Dissector Message Type Address complete
6151 dissect_isup_address_complete_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6152 { proto_item* parameter_item;
6153 proto_tree* parameter_tree;
6154 tvbuff_t *parameter_tvb;
6156 gint parameter_type, actual_length;
6158 /* Do stuff for first mandatory fixed parameter: backward call indicators*/
6159 parameter_type = PARAM_TYPE_BACKW_CALL_IND;
6160 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6161 BACKWARD_CALL_IND_LENGTH,
6162 "Backward Call Indicators");
6163 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6164 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6165 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6166 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(BACKWARD_CALL_IND_LENGTH, actual_length), BACKWARD_CALL_IND_LENGTH);
6167 dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6168 offset += BACKWARD_CALL_IND_LENGTH;
6171 /* ------------------------------------------------------------------
6172 Dissector Message Type Connect
6175 dissect_isup_connect_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6176 { proto_item* parameter_item;
6177 proto_tree* parameter_tree;
6178 tvbuff_t *parameter_tvb;
6180 gint parameter_type, actual_length;
6182 /* Do stuff for first mandatory fixed parameter: backward call indicators*/
6183 parameter_type = PARAM_TYPE_BACKW_CALL_IND;
6184 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6185 BACKWARD_CALL_IND_LENGTH,
6186 "Backward Call Indicators");
6187 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6188 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6189 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6190 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(BACKWARD_CALL_IND_LENGTH, actual_length), BACKWARD_CALL_IND_LENGTH);
6191 dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6192 offset += BACKWARD_CALL_IND_LENGTH;
6195 /* ------------------------------------------------------------------
6196 Dissector Message Type release message
6199 dissect_isup_release_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6200 { proto_item* parameter_item;
6201 proto_tree* parameter_tree;
6202 tvbuff_t *parameter_tvb;
6204 gint parameter_type, parameter_pointer, parameter_length, actual_length;
6206 /* Do stuff for mandatory variable parameter Cause indicators */
6207 parameter_type = PARAM_TYPE_CAUSE_INDICATORS;
6209 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6210 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6212 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6213 offset + parameter_pointer,
6214 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6215 "Cause indicators");
6216 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6217 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6218 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6219 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6220 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6221 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6222 switch (isup_standard){
6224 dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6227 dissect_ansi_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6230 offset += PARAMETER_POINTER_LENGTH;
6234 /* ------------------------------------------------------------------
6235 Dissector Message Type Resume/Suspend
6238 dissect_isup_suspend_resume_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6239 { proto_item* parameter_item;
6240 proto_tree* parameter_tree;
6241 tvbuff_t *parameter_tvb;
6243 gint parameter_type, actual_length;
6245 /* Do stuff for first mandatory fixed parameter: backward call indicators*/
6246 parameter_type = PARAM_TYPE_SUSP_RESUME_IND;
6247 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6248 SUSPEND_RESUME_IND_LENGTH,
6249 "Suspend/Resume indicator");
6250 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6251 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6252 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6253 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(SUSPEND_RESUME_IND_LENGTH, actual_length), SUSPEND_RESUME_IND_LENGTH);
6254 dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6255 offset += SUSPEND_RESUME_IND_LENGTH;
6258 /* ------------------------------------------------------------------
6259 Dissector Message Type Circuit group reset/query message
6262 dissect_isup_circuit_group_reset_query_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6263 { proto_item* parameter_item;
6264 proto_tree* parameter_tree;
6265 tvbuff_t *parameter_tvb;
6267 gint parameter_type, parameter_pointer, parameter_length, actual_length;
6269 /* Do stuff for mandatory variable parameter range and status*/
6270 parameter_type = PARAM_TYPE_RANGE_AND_STATUS;
6272 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6273 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6275 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6276 offset + parameter_pointer,
6277 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6278 "Range and status");
6279 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6280 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6281 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6282 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6283 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6284 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6285 dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
6286 offset += PARAMETER_POINTER_LENGTH;
6290 /* ------------------------------------------------------------------
6291 Dissector Message Type Circuit group blocking/blocking ack/unblocking/unblocking ack messages
6294 dissect_isup_circuit_group_blocking_messages(tvbuff_t *message_tvb, proto_tree *isup_tree)
6295 { proto_item* parameter_item;
6296 proto_tree* parameter_tree;
6297 tvbuff_t *parameter_tvb;
6299 gint parameter_type, parameter_pointer, parameter_length, actual_length;
6301 /* Do stuff for first mandatory fixed parameter: circuit group supervision message type*/
6302 parameter_type = PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE;
6303 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6304 CIRC_GRP_SV_MSG_TYPE_LENGTH,
6305 "Circuit group supervision message type");
6306 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6307 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6308 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6309 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CIRC_GRP_SV_MSG_TYPE_LENGTH, actual_length), CIRC_GRP_SV_MSG_TYPE_LENGTH);
6310 dissect_isup_circuit_group_supervision_message_type_parameter(parameter_tvb, parameter_tree, parameter_item);
6311 offset += CIRC_GRP_SV_MSG_TYPE_LENGTH;
6313 /* Do stuff for mandatory variable parameter range and status*/
6314 parameter_type = PARAM_TYPE_RANGE_AND_STATUS;
6316 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6317 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6319 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6320 offset + parameter_pointer,
6321 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6322 "Range and status");
6323 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6324 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6325 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6326 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6327 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6328 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6329 dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
6330 offset += PARAMETER_POINTER_LENGTH;
6335 /* ------------------------------------------------------------------
6336 Dissector Message Type Facility request/accepted
6339 dissect_isup_facility_request_accepted_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6340 { proto_item* parameter_item;
6341 proto_tree* parameter_tree;
6342 tvbuff_t *parameter_tvb;
6344 gint parameter_type, actual_length;
6346 /* Do stuff for first mandatory fixed parameter: facility indicators*/
6347 parameter_type = PARAM_TYPE_FACILITY_IND;
6348 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6349 FACILITY_IND_LENGTH,
6350 "Facility indicator");
6351 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6352 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6353 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6354 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FACILITY_IND_LENGTH, actual_length), FACILITY_IND_LENGTH);
6355 dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
6356 offset += FACILITY_IND_LENGTH;
6359 /* ------------------------------------------------------------------
6360 Dissector Message Type Facility reject
6363 dissect_isup_facility_reject_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6364 { proto_item* parameter_item;
6365 proto_tree* parameter_tree;
6366 tvbuff_t *parameter_tvb;
6368 gint parameter_type, parameter_pointer, parameter_length, actual_length;
6370 /* Do stuff for first mandatory fixed parameter: facility indicators*/
6371 parameter_type = PARAM_TYPE_FACILITY_IND;
6372 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6373 FACILITY_IND_LENGTH,
6374 "Facility indicator");
6375 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6376 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6377 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6378 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FACILITY_IND_LENGTH, actual_length), FACILITY_IND_LENGTH);
6379 dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
6380 offset += FACILITY_IND_LENGTH;
6382 /* Do stuff for mandatory variable parameter Cause indicators */
6383 parameter_type = PARAM_TYPE_CAUSE_INDICATORS;
6385 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6386 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6388 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6389 offset + parameter_pointer,
6390 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6391 "Cause indicators, see Q.850");
6392 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6393 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6394 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6395 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6396 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6397 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6398 switch (isup_standard){
6400 dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6403 dissect_ansi_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6406 offset += PARAMETER_POINTER_LENGTH;
6410 /* ------------------------------------------------------------------
6411 Dissector Message Type Circuit group reset acknowledgement message
6414 dissect_isup_circuit_group_reset_acknowledgement_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6415 { proto_item* parameter_item;
6416 proto_tree* parameter_tree;
6417 tvbuff_t *parameter_tvb;
6419 gint parameter_type, parameter_pointer, parameter_length, actual_length;
6421 /* Do stuff for mandatory variable parameter range and status*/
6422 parameter_type = PARAM_TYPE_RANGE_AND_STATUS;
6424 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6425 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6427 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6428 offset + parameter_pointer,
6429 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6430 "Range and status");
6431 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6432 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6433 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6434 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6435 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6436 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6437 dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
6438 offset += PARAMETER_POINTER_LENGTH;
6442 /* ------------------------------------------------------------------
6443 Dissector Message Type Circuit group query response message
6446 dissect_isup_circuit_group_query_response_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6447 { proto_item* parameter_item;
6448 proto_tree* parameter_tree;
6449 tvbuff_t *parameter_tvb;
6451 gint parameter_type, parameter_pointer, parameter_length, actual_length;
6453 /* Do stuff for 1. mandatory variable parameter range and status*/
6454 parameter_type = PARAM_TYPE_RANGE_AND_STATUS;
6456 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6457 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6459 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6460 offset + parameter_pointer,
6461 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6462 "Range and status");
6463 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6464 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6465 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6466 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6467 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6468 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6469 dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
6470 offset += PARAMETER_POINTER_LENGTH;
6472 /* Do stuff for 2. mandatory variable parameter Circuit state indicator*/
6473 parameter_type = PARAM_TYPE_CIRC_STATE_IND;
6475 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6476 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6478 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6479 offset + parameter_pointer,
6480 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6481 "Circuit state indicator (national use)");
6482 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6483 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6484 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6485 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6486 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6487 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6488 dissect_isup_circuit_state_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
6489 offset += PARAMETER_POINTER_LENGTH;
6493 /* ------------------------------------------------------------------
6494 Dissector Message Type Call Progress
6497 dissect_isup_call_progress_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6498 { proto_item* parameter_item;
6499 proto_tree* parameter_tree;
6500 tvbuff_t *parameter_tvb;
6502 gint parameter_type, actual_length;
6504 /* Do stuff for first mandatory fixed parameter: Event information*/
6505 parameter_type = PARAM_TYPE_EVENT_INFO;
6506 parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
6508 "Event information");
6509 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6510 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6511 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6512 parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(EVENT_INFO_LENGTH, actual_length), EVENT_INFO_LENGTH);
6513 dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item);
6514 offset += EVENT_INFO_LENGTH;
6517 /* ------------------------------------------------------------------
6518 Dissector Message Type User-to-User information
6521 dissect_isup_user_to_user_information_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6522 { proto_item* parameter_item;
6523 proto_tree* parameter_tree;
6524 tvbuff_t *parameter_tvb;
6526 gint parameter_type, parameter_pointer, parameter_length, actual_length;
6528 /* Do stuff for mandatory variable parameter User-to-user information*/
6529 parameter_type = PARAM_TYPE_USER_TO_USER_INFO;
6531 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6532 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6534 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6535 offset + parameter_pointer,
6536 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6537 "User-to-user information, see Q.931");
6538 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6539 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6540 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6541 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6542 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6543 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6544 dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
6545 offset += PARAMETER_POINTER_LENGTH;
6549 /* ------------------------------------------------------------------
6550 Dissector Message Type Confusion
6553 dissect_isup_confusion_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
6554 { proto_item* parameter_item;
6555 proto_tree* parameter_tree;
6556 tvbuff_t *parameter_tvb;
6558 gint parameter_type, parameter_pointer, parameter_length, actual_length;
6560 /* Do stuff for mandatory variable parameter Cause indicators */
6561 parameter_type = PARAM_TYPE_CAUSE_INDICATORS;
6563 parameter_pointer = tvb_get_guint8(message_tvb, offset);
6564 parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
6566 parameter_item = proto_tree_add_text(isup_tree, message_tvb,
6567 offset + parameter_pointer,
6568 parameter_length + PARAMETER_LENGTH_IND_LENGTH,
6569 "Cause indicators, see Q.850");
6570 parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
6571 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
6572 proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
6573 proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
6574 actual_length = tvb_ensure_length_remaining(message_tvb, offset);
6575 parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
6577 switch (isup_standard){
6579 dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6582 dissect_ansi_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
6585 offset += PARAMETER_POINTER_LENGTH;
6589 /* ------------------------------------------------------------------ */
6591 dissect_isup_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup_tree)
6593 static isup_tap_rec_t tap_rec;
6594 tvbuff_t *parameter_tvb;
6595 tvbuff_t *optional_parameter_tvb;
6596 proto_item* pass_along_item;
6597 proto_tree* pass_along_tree;
6598 gint offset, bufferlength;
6599 guint8 message_type, opt_parameter_pointer;
6600 gint opt_part_possible = FALSE; /* default setting - for message types allowing optional
6601 params explicitely set to TRUE in case statement */
6602 tap_calling_number = NULL;
6605 /* Extract message type field */
6606 message_type = tvb_get_guint8(message_tvb,0);
6608 switch (isup_standard){
6610 proto_tree_add_uint_format(isup_tree, hf_isup_message_type, message_tvb, 0, MESSAGE_TYPE_LENGTH, message_type, "Message type: %s (%u)", val_to_str(message_type, isup_message_type_value, "reserved"), message_type);
6613 proto_tree_add_uint_format(isup_tree, hf_isup_message_type, message_tvb, 0, MESSAGE_TYPE_LENGTH, message_type, "Message type: %s (%u)", val_to_str(message_type, ansi_isup_message_type_value, "reserved"), message_type);
6616 offset += MESSAGE_TYPE_LENGTH;
6618 tap_rec.message_type = message_type;
6619 tap_rec.calling_number = NULL;
6620 tap_rec.called_number = NULL;
6622 parameter_tvb = tvb_new_subset(message_tvb, offset, -1, -1);
6624 /* distinguish between message types:*/
6625 switch (isup_standard){
6627 switch (message_type) {
6628 case MESSAGE_TYPE_INITIAL_ADDR:
6629 offset += dissect_isup_initial_address_message(parameter_tvb, isup_tree);
6630 opt_part_possible = TRUE;
6632 case MESSAGE_TYPE_SUBSEQ_ADDR:
6633 offset += dissect_isup_subsequent_address_message(parameter_tvb, isup_tree);
6634 opt_part_possible = TRUE;
6636 case MESSAGE_TYPE_INFO_REQ:
6637 offset += dissect_isup_information_request_message(parameter_tvb, isup_tree);
6638 opt_part_possible = TRUE;
6640 case MESSAGE_TYPE_INFO:
6641 offset += dissect_isup_information_message(parameter_tvb, isup_tree);
6642 opt_part_possible = TRUE;
6644 case MESSAGE_TYPE_CONTINUITY:
6645 offset += dissect_isup_continuity_message(parameter_tvb, isup_tree);
6647 case MESSAGE_TYPE_ADDR_CMPL:
6648 offset += dissect_isup_address_complete_message(parameter_tvb, isup_tree);
6649 opt_part_possible = TRUE;
6651 case MESSAGE_TYPE_CONNECT:
6652 offset += dissect_isup_connect_message(parameter_tvb, isup_tree);
6653 opt_part_possible = TRUE;
6655 case MESSAGE_TYPE_FORW_TRANS:
6656 /* no dissector necessary since no mandatory parameters included */
6657 opt_part_possible = TRUE;
6659 case MESSAGE_TYPE_ANSWER:
6660 /* no dissector necessary since no mandatory parameters included */
6661 opt_part_possible = TRUE;
6663 case MESSAGE_TYPE_RELEASE:
6664 offset += dissect_isup_release_message(parameter_tvb, isup_tree);
6665 opt_part_possible = TRUE;
6667 case MESSAGE_TYPE_SUSPEND:
6668 offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
6669 opt_part_possible = TRUE;
6671 case MESSAGE_TYPE_RESUME:
6672 offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
6673 opt_part_possible = TRUE;
6675 case MESSAGE_TYPE_REL_CMPL:
6676 /* no dissector necessary since no mandatory parameters included */
6677 opt_part_possible = TRUE;
6679 case MESSAGE_TYPE_CONT_CHECK_REQ:
6680 /* no dissector necessary since no mandatory parameters included */
6682 case MESSAGE_TYPE_RESET_CIRCUIT:
6683 /* no dissector necessary since no mandatory parameters included */
6685 case MESSAGE_TYPE_BLOCKING:
6686 /* no dissector necessary since no mandatory parameters included */
6688 case MESSAGE_TYPE_UNBLOCKING:
6689 /* no dissector necessary since no mandatory parameters included */
6691 case MESSAGE_TYPE_BLOCK_ACK:
6692 /* no dissector necessary since no mandatory parameters included */
6694 case MESSAGE_TYPE_UNBLOCK_ACK:
6695 /* no dissector necessary since no mandatory parameters included */
6697 case MESSAGE_TYPE_CIRC_GRP_RST:
6698 offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
6700 case MESSAGE_TYPE_CIRC_GRP_BLCK:
6701 offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
6703 case MESSAGE_TYPE_CIRC_GRP_UNBL:
6704 offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
6706 case MESSAGE_TYPE_CIRC_GRP_BL_ACK:
6707 offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
6709 case MESSAGE_TYPE_CIRC_GRP_UNBL_ACK:
6710 offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
6712 case MESSAGE_TYPE_FACILITY_REQ:
6713 offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
6714 opt_part_possible = TRUE;
6716 case MESSAGE_TYPE_FACILITY_ACC:
6717 offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
6718 opt_part_possible = TRUE;
6720 case MESSAGE_TYPE_FACILITY_REJ:
6721 offset += dissect_isup_facility_reject_message(parameter_tvb, isup_tree);
6722 opt_part_possible = TRUE;
6724 case MESSAGE_TYPE_LOOP_BACK_ACK:
6725 /* no dissector necessary since no mandatory parameters included */
6727 case MESSAGE_TYPE_PASS_ALONG:
6728 /* call dissect_isup_message recursively */
6729 { guint8 pa_message_type;
6730 pa_message_type = tvb_get_guint8(parameter_tvb, 0);
6731 pass_along_item = proto_tree_add_text(isup_tree, parameter_tvb, offset, -1, "Pass-along: %s Message (%u)", val_to_str(pa_message_type, isup_message_type_value_acro, "reserved"), pa_message_type);
6732 pass_along_tree = proto_item_add_subtree(pass_along_item, ett_isup_pass_along_message);
6733 dissect_isup_message(parameter_tvb, pinfo, pass_along_tree);
6736 case MESSAGE_TYPE_CIRC_GRP_RST_ACK:
6737 offset += dissect_isup_circuit_group_reset_acknowledgement_message(parameter_tvb, isup_tree);
6739 case MESSAGE_TYPE_CIRC_GRP_QRY:
6740 offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
6742 case MESSAGE_TYPE_CIRC_GRP_QRY_RSP:
6743 offset += dissect_isup_circuit_group_query_response_message(parameter_tvb, isup_tree);
6745 case MESSAGE_TYPE_CALL_PROGRSS:
6746 offset += dissect_isup_call_progress_message(parameter_tvb, isup_tree);
6747 opt_part_possible = TRUE;
6749 case MESSAGE_TYPE_USER2USER_INFO:
6750 offset += dissect_isup_user_to_user_information_message(parameter_tvb, isup_tree);
6751 opt_part_possible = TRUE;
6753 case MESSAGE_TYPE_UNEQUIPPED_CIC:
6754 /* no dissector necessary since no mandatory parameters included */
6756 case MESSAGE_TYPE_CONFUSION:
6757 offset += dissect_isup_confusion_message(parameter_tvb, isup_tree);
6758 opt_part_possible = TRUE;
6760 case MESSAGE_TYPE_OVERLOAD:
6761 /* no dissector necessary since no mandatory parameters included */
6763 case MESSAGE_TYPE_CHARGE_INFO:
6764 /* do nothing since format is a national matter */
6765 bufferlength = tvb_length_remaining(message_tvb, offset);
6766 if (bufferlength != 0)
6767 proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Format is a national matter");
6769 case MESSAGE_TYPE_NETW_RESRC_MGMT:
6770 /* no dissector necessary since no mandatory parameters included */
6771 opt_part_possible = TRUE;
6773 case MESSAGE_TYPE_FACILITY:
6774 /* no dissector necessary since no mandatory parameters included */
6775 opt_part_possible = TRUE;
6777 case MESSAGE_TYPE_USER_PART_TEST:
6778 /* no dissector necessary since no mandatory parameters included */
6779 opt_part_possible = TRUE;
6781 case MESSAGE_TYPE_USER_PART_AVAIL:
6782 /* no dissector necessary since no mandatory parameters included */
6783 opt_part_possible = TRUE;
6785 case MESSAGE_TYPE_IDENT_REQ:
6786 /* no dissector necessary since no mandatory parameters included */
6787 opt_part_possible = TRUE;
6789 case MESSAGE_TYPE_IDENT_RSP:
6790 /* no dissector necessary since no mandatory parameters included */
6791 opt_part_possible = TRUE;
6793 case MESSAGE_TYPE_SEGMENTATION:
6794 /* no dissector necessary since no mandatory parameters included */
6795 opt_part_possible = TRUE;
6797 case MESSAGE_TYPE_LOOP_PREVENTION:
6798 /* no dissector necessary since no mandatory parameters included */
6799 opt_part_possible = TRUE;
6801 case MESSAGE_TYPE_APPLICATION_TRANS:
6802 /* no dissector necessary since no mandatory parameters included */
6803 opt_part_possible = TRUE;
6805 case MESSAGE_TYPE_PRE_RELEASE_INFO:
6806 /* no dissector necessary since no mandatory parameters included */
6807 opt_part_possible = TRUE;
6809 case MESSAGE_TYPE_SUBSEQUENT_DIR_NUM:
6810 /* do nothing since format is a national matter */
6811 bufferlength = tvb_length_remaining(message_tvb, offset);
6812 if (bufferlength != 0)
6813 proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Format is a national matter");
6816 bufferlength = tvb_length_remaining(message_tvb, offset);
6817 if (bufferlength != 0)
6818 proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Unknown Message type (possibly reserved/used in former ISUP version)");
6823 /* TODO if neccessary make new "dissect_ansi_isup_xxx() routines or add branches in the current ones.
6825 switch (message_type) {
6826 case MESSAGE_TYPE_INITIAL_ADDR:
6827 offset += dissect_isup_initial_address_message(parameter_tvb, isup_tree);
6828 opt_part_possible = TRUE;
6830 case MESSAGE_TYPE_SUBSEQ_ADDR:
6831 offset += dissect_isup_subsequent_address_message(parameter_tvb, isup_tree);
6832 opt_part_possible = TRUE;
6834 case MESSAGE_TYPE_INFO_REQ:
6835 offset += dissect_isup_information_request_message(parameter_tvb, isup_tree);
6836 opt_part_possible = TRUE;
6838 case MESSAGE_TYPE_INFO:
6839 offset += dissect_isup_information_message(parameter_tvb, isup_tree);
6840 opt_part_possible = TRUE;
6842 case MESSAGE_TYPE_CONTINUITY:
6843 offset += dissect_isup_continuity_message(parameter_tvb, isup_tree);
6845 case MESSAGE_TYPE_ADDR_CMPL:
6846 offset += dissect_isup_address_complete_message(parameter_tvb, isup_tree);
6847 opt_part_possible = TRUE;
6849 case MESSAGE_TYPE_CONNECT:
6850 offset += dissect_isup_connect_message(parameter_tvb, isup_tree);
6851 opt_part_possible = TRUE;
6853 case MESSAGE_TYPE_FORW_TRANS:
6854 /* no dissector necessary since no mandatory parameters included */
6855 opt_part_possible = TRUE;
6857 case MESSAGE_TYPE_ANSWER:
6858 /* no dissector necessary since no mandatory parameters included */
6859 opt_part_possible = TRUE;
6861 case MESSAGE_TYPE_RELEASE:
6862 offset += dissect_isup_release_message(parameter_tvb, isup_tree);
6863 opt_part_possible = TRUE;
6865 case MESSAGE_TYPE_SUSPEND:
6866 offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
6867 opt_part_possible = TRUE;
6869 case MESSAGE_TYPE_RESUME:
6870 offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
6871 opt_part_possible = TRUE;
6873 case MESSAGE_TYPE_REL_CMPL:
6874 /* no dissector necessary since no mandatory parameters included */
6876 case MESSAGE_TYPE_CONT_CHECK_REQ:
6877 /* no dissector necessary since no mandatory parameters included */
6879 case MESSAGE_TYPE_RESET_CIRCUIT:
6880 /* no dissector necessary since no mandatory parameters included */
6882 case MESSAGE_TYPE_BLOCKING:
6883 /* no dissector necessary since no mandatory parameters included */
6885 case MESSAGE_TYPE_UNBLOCKING:
6886 /* no dissector necessary since no mandatory parameters included */
6888 case MESSAGE_TYPE_BLOCK_ACK:
6889 /* no dissector necessary since no mandatory parameters included */
6891 case MESSAGE_TYPE_UNBLOCK_ACK:
6892 /* no dissector necessary since no mandatory parameters included */
6894 case MESSAGE_TYPE_CIRC_GRP_RST:
6895 offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
6897 case MESSAGE_TYPE_CIRC_GRP_BLCK:
6898 offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
6900 case MESSAGE_TYPE_CIRC_GRP_UNBL:
6901 offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
6903 case MESSAGE_TYPE_CIRC_GRP_BL_ACK:
6904 offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
6906 case MESSAGE_TYPE_CIRC_GRP_UNBL_ACK:
6907 offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
6909 case MESSAGE_TYPE_FACILITY_REQ:
6910 offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
6911 opt_part_possible = TRUE;
6913 case MESSAGE_TYPE_FACILITY_ACC:
6914 offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
6915 opt_part_possible = TRUE;
6917 case MESSAGE_TYPE_FACILITY_REJ:
6918 offset += dissect_isup_facility_reject_message(parameter_tvb, isup_tree);
6919 opt_part_possible = TRUE;
6921 case MESSAGE_TYPE_LOOP_BACK_ACK:
6922 /* no dissector necessary since no mandatory parameters included */
6924 case MESSAGE_TYPE_PASS_ALONG:
6925 /* call dissect_isup_message recursively */
6926 { guint8 pa_message_type;
6927 pa_message_type = tvb_get_guint8(parameter_tvb, 0);
6928 pass_along_item = proto_tree_add_text(isup_tree, parameter_tvb, offset, -1, "Pass-along: %s Message (%u)", val_to_str(pa_message_type, isup_message_type_value_acro, "reserved"), pa_message_type);
6929 pass_along_tree = proto_item_add_subtree(pass_along_item, ett_isup_pass_along_message);
6930 dissect_isup_message(parameter_tvb, pinfo, pass_along_tree);
6933 case MESSAGE_TYPE_CIRC_GRP_RST_ACK:
6934 offset += dissect_isup_circuit_group_reset_acknowledgement_message(parameter_tvb, isup_tree);
6936 case MESSAGE_TYPE_CIRC_GRP_QRY:
6937 offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
6939 case MESSAGE_TYPE_CIRC_GRP_QRY_RSP:
6940 offset += dissect_isup_circuit_group_query_response_message(parameter_tvb, isup_tree);
6942 case MESSAGE_TYPE_CALL_PROGRSS:
6943 offset += dissect_isup_call_progress_message(parameter_tvb, isup_tree);
6944 opt_part_possible = TRUE;
6946 case MESSAGE_TYPE_USER2USER_INFO:
6947 offset += dissect_isup_user_to_user_information_message(parameter_tvb, isup_tree);
6948 opt_part_possible = TRUE;
6950 case MESSAGE_TYPE_UNEQUIPPED_CIC:
6951 /* no dissector necessary since no mandatory parameters included */
6953 case MESSAGE_TYPE_CONFUSION:
6954 offset += dissect_isup_confusion_message(parameter_tvb, isup_tree);
6955 opt_part_possible = TRUE;
6957 case MESSAGE_TYPE_OVERLOAD:
6958 /* no dissector necessary since no mandatory parameters included */
6960 case MESSAGE_TYPE_CHARGE_INFO:
6961 /* do nothing since format is a national matter */
6962 bufferlength = tvb_length_remaining(message_tvb, offset);
6963 if (bufferlength != 0)
6964 proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Format is a national matter");
6966 case MESSAGE_TYPE_NETW_RESRC_MGMT:
6967 /* no dissector necessary since no mandatory parameters included */
6968 opt_part_possible = TRUE;
6970 case MESSAGE_TYPE_FACILITY:
6971 /* no dissector necessary since no mandatory parameters included */
6972 opt_part_possible = TRUE;
6974 case MESSAGE_TYPE_USER_PART_TEST:
6975 /* no dissector necessary since no mandatory parameters included */
6976 opt_part_possible = TRUE;
6978 case MESSAGE_TYPE_USER_PART_AVAIL:
6979 /* no dissector necessary since no mandatory parameters included */
6980 opt_part_possible = TRUE;
6982 case MESSAGE_TYPE_IDENT_REQ:
6983 /* no dissector necessary since no mandatory parameters included */
6984 opt_part_possible = TRUE;
6986 case MESSAGE_TYPE_IDENT_RSP:
6987 /* no dissector necessary since no mandatory parameters included */
6988 opt_part_possible = TRUE;
6990 case MESSAGE_TYPE_SEGMENTATION:
6991 /* no dissector necessary since no mandatory parameters included */
6992 opt_part_possible = TRUE;
6994 case MESSAGE_TYPE_LOOP_PREVENTION:
6995 /* no dissector necessary since no mandatory parameters included */
6996 opt_part_possible = TRUE;
6998 case MESSAGE_TYPE_APPLICATION_TRANS:
6999 /* no dissector necessary since no mandatory parameters included */
7000 opt_part_possible = TRUE;
7002 case MESSAGE_TYPE_PRE_RELEASE_INFO:
7003 /* no dissector necessary since no mandatory parameters included */
7004 opt_part_possible = TRUE;
7006 case MESSAGE_TYPE_SUBSEQUENT_DIR_NUM:
7007 /* do nothing since format is a national matter */
7008 bufferlength = tvb_length_remaining(message_tvb, offset);
7009 if (bufferlength != 0)
7010 proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Format is a national matter");
7012 case ANSI_ISUP_MESSAGE_TYPE_CIRCUIT_RES_ACK:
7013 /* no dissector necessary since no mandatory parameters included */
7015 case ANSI_ISUP_MESSAGE_TYPE_CIRCUIT_RES:
7016 offset += dissect_ansi_isup_circuit_reservation_message( parameter_tvb, isup_tree );
7018 case ANSI_ISUP_MESSAGE_TYPE_CCT_VAL_TEST_RSP:
7019 opt_part_possible = TRUE;
7020 offset += dissect_ansi_isup_circuit_validation_test_resp_message( parameter_tvb, isup_tree );
7022 case ANSI_ISUP_MESSAGE_TYPE_CCT_VAL_TEST:
7023 /* no dissector necessary since no mandatory parameters included */
7026 bufferlength = tvb_length_remaining(message_tvb, offset);
7027 if (bufferlength != 0)
7028 proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Unknown Message type (possibly reserved/used in former ISUP version)");
7034 /* extract pointer to start of optional part (if any) */
7035 if (opt_part_possible == TRUE){
7036 opt_parameter_pointer = tvb_get_guint8(message_tvb, offset);
7037 if (opt_parameter_pointer > 0){
7038 proto_tree_add_uint_format(isup_tree, hf_isup_pointer_to_start_of_optional_part, message_tvb, offset, PARAMETER_POINTER_LENGTH, opt_parameter_pointer, "Pointer to start of optional part: %u", opt_parameter_pointer);
7039 offset += opt_parameter_pointer;
7040 optional_parameter_tvb = tvb_new_subset(message_tvb, offset, -1, -1 );
7041 switch(isup_standard){
7043 dissect_isup_optional_parameter(optional_parameter_tvb, pinfo, isup_tree);
7046 dissect_ansi_isup_optional_parameter(optional_parameter_tvb, pinfo, isup_tree);
7051 proto_tree_add_uint_format(isup_tree, hf_isup_pointer_to_start_of_optional_part, message_tvb, offset, PARAMETER_POINTER_LENGTH, opt_parameter_pointer, "No optional parameter present (Pointer: %u)", opt_parameter_pointer);
7053 else if (message_type !=MESSAGE_TYPE_CHARGE_INFO)
7054 proto_tree_add_text(isup_tree, message_tvb, 0, 0, "No optional parameters are possible with this message type");
7055 /* if there are calling/called number, we'll get them for the tap */
7057 tap_rec.calling_number=tap_calling_number?tap_calling_number:ep_strdup("");
7058 tap_rec.called_number=tap_called_number;
7059 tap_rec.cause_value=tap_cause_value;
7060 tap_queue_packet(isup_tap, pinfo, &tap_rec);
7063 /* ------------------------------------------------------------------ */
7065 dissect_isup(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
7068 /* Set up structures needed to add the protocol subtree and manage it */
7070 proto_tree *isup_tree = NULL;
7071 tvbuff_t *message_tvb;
7073 guint8 message_type;
7075 switch(mtp3_standard){
7077 isup_standard = ANSI_STANDARD;
7080 isup_standard = ITU_STANDARD;
7083 /* Make entries in Protocol column and Info column on summary display */
7084 switch (isup_standard){
7086 if (check_col(pinfo->cinfo, COL_PROTOCOL))
7087 col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISUP(ITU)");
7090 if (check_col(pinfo->cinfo, COL_PROTOCOL))
7091 col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISUP(ANSI)");
7095 /* Extract message type field */
7096 message_type = tvb_get_guint8(tvb, CIC_OFFSET + CIC_LENGTH);
7097 /* dissect CIC in main dissector since pass-along message type carrying complete IUSP message w/o CIC needs
7098 recursive message dissector call */
7099 if (mtp3_standard == ANSI_STANDARD)
7100 cic = tvb_get_letohs(tvb, CIC_OFFSET) & 0x3FFF; /*since upper 2 bits spare */
7101 else /* ITU, China, and Japan; yes, J7's CICs are a different size */
7102 cic = tvb_get_letohs(tvb, CIC_OFFSET) & 0x0FFF; /*since upper 4 bits spare */
7104 pinfo->ctype = CT_ISUP;
7105 pinfo->circuit_id = cic;
7107 if (check_col(pinfo->cinfo, COL_INFO))
7109 if (isup_show_cic_in_info){
7110 switch (isup_standard){
7112 col_add_fstr(pinfo->cinfo, COL_INFO, "%s (CIC %u) ", val_to_str(message_type, isup_message_type_value_acro, "reserved"), cic);
7115 col_add_fstr(pinfo->cinfo, COL_INFO, "%s (CIC %u) ", val_to_str(message_type, ansi_isup_message_type_value_acro, "reserved"), cic);
7119 switch (isup_standard){
7121 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str(message_type, isup_message_type_value_acro, "reserved"));
7124 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str(message_type, ansi_isup_message_type_value_acro, "reserved"));
7130 /* In the interest of speed, if "tree" is NULL, don't do any work not
7131 * necessary to generate protocol tree items.
7134 ti = proto_tree_add_item(tree, proto_isup, tvb, 0, -1, FALSE);
7135 isup_tree = proto_item_add_subtree(ti, ett_isup);
7138 proto_tree_add_uint_format(isup_tree, hf_isup_cic, tvb, CIC_OFFSET, CIC_LENGTH, cic, "CIC: %u", cic);
7141 message_tvb = tvb_new_subset(tvb, CIC_LENGTH, -1, -1);
7142 dissect_isup_message(message_tvb, pinfo, isup_tree);
7145 /* ------------------------------------------------------------------ */
7147 dissect_bicc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
7150 /* Set up structures needed to add the protocol subtree and manage it */
7152 proto_tree *bicc_tree = NULL;
7153 tvbuff_t *message_tvb;
7155 guint8 message_type;
7157 /*circuit_t *circuit;*/
7159 /* Make entries in Protocol column and Info column on summary display */
7160 if (check_col(pinfo->cinfo, COL_PROTOCOL))
7161 col_set_str(pinfo->cinfo, COL_PROTOCOL, "BICC");
7163 /* Extract message type field */
7164 message_type = tvb_get_guint8(tvb, BICC_CIC_OFFSET + BICC_CIC_LENGTH);
7166 if (check_col(pinfo->cinfo, COL_INFO))
7167 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str(message_type, isup_message_type_value_acro, "reserved"));
7169 /* dissect CIC in main dissector since pass-along message type carrying complete BICC/ISUP message w/o CIC needs
7170 * recursive message dissector call
7172 bicc_cic = tvb_get_letohl(tvb, BICC_CIC_OFFSET);
7174 pinfo->ctype = CT_BICC;
7175 pinfo->circuit_id = bicc_cic;
7177 /* In the interest of speed, if "tree" is NULL, don't do any work not
7178 * necessary to generate protocol tree items.
7181 ti = proto_tree_add_item(tree, proto_bicc, tvb, 0, -1, FALSE);
7182 bicc_tree = proto_item_add_subtree(ti, ett_bicc);
7185 proto_tree_add_uint_format(bicc_tree, hf_bicc_cic, tvb, BICC_CIC_OFFSET, BICC_CIC_LENGTH, bicc_cic, "CIC: %u", bicc_cic);
7188 message_tvb = tvb_new_subset(tvb, BICC_CIC_LENGTH, -1, -1);
7189 dissect_isup_message(message_tvb, pinfo, bicc_tree);
7193 dissect_application_isup(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
7195 /* Set up structures needed to add the protocol subtree and manage it */
7197 proto_tree *isup_tree = NULL;
7198 tvbuff_t *message_tvb;
7199 guint8 message_type;
7201 /* Make entries in Protocol column and Info column on summary display */
7202 if (check_col(pinfo->cinfo, COL_PROTOCOL))
7203 col_append_str(pinfo->cinfo, COL_PROTOCOL, "/ISUP(ITU)");
7205 /* Extract message type field */
7206 message_type = tvb_get_guint8(tvb, 0);
7207 /* application/ISUP has no CIC */
7208 if (check_col(pinfo->cinfo, COL_INFO))
7209 col_append_sep_fstr(pinfo->cinfo, COL_INFO, ", ", "ISUP:%s", val_to_str(message_type, isup_message_type_value_acro, "reserved"));
7211 /* In the interest of speed, if "tree" is NULL, don't do any work not
7212 necessary to generate protocol tree items. */
7214 ti = proto_tree_add_item(tree, proto_isup, tvb, 0, -1, FALSE);
7215 isup_tree = proto_item_add_subtree(ti, ett_isup);
7218 message_tvb = tvb_new_subset(tvb, 0, -1, -1);
7219 dissect_isup_message(message_tvb, pinfo, isup_tree);
7221 /* ---------------------------------------------------- stats tree
7223 static int st_node_msg = -1;
7224 static int st_node_dir = -1;
7227 msg_stats_tree_init(stats_tree* st)
7229 st_node_msg = stats_tree_create_node(st, "Messages by Type", 0, TRUE);
7230 st_node_dir = stats_tree_create_node(st, "Messages by Direction", 0, TRUE);
7234 msg_stats_tree_packet(stats_tree *st, packet_info *pinfo, epan_dissect_t *edt _U_, const void *p )
7236 const gchar* msg = match_strval(((const isup_tap_rec_t*)p)->message_type, isup_message_type_value_acro);
7237 gchar src[MAX_ADDR_STR_LEN];
7238 gchar dst[MAX_ADDR_STR_LEN];
7239 gchar dir[MAX_ADDR_STR_LEN];
7243 address_to_str_buf(&(pinfo->src), src, sizeof src);
7244 address_to_str_buf(&(pinfo->dst), dst, sizeof dst);
7245 g_snprintf(dir,sizeof(dir),"%s->%s",src,dst);
7247 msg_node = tick_stat_node(st, msg, st_node_msg, TRUE);
7248 tick_stat_node(st, dir, msg_node, FALSE);
7250 dir_node = tick_stat_node(st, dir, st_node_dir, TRUE);
7251 tick_stat_node(st, msg, dir_node, FALSE);
7256 /*---------------------------------------------------------------------*/
7257 /* Register the protocol with Wireshark */
7259 proto_register_isup(void)
7261 /* Setup list of header fields See Section 1.6.1 for details*/
7262 static hf_register_info hf[] = {
7264 { "CIC", "isup.cic",
7265 FT_UINT16, BASE_HEX, NULL, 0x0,
7268 { &hf_isup_message_type,
7269 { "Message Type", "isup.message_type",
7270 FT_UINT8, BASE_DEC, NULL, 0x0,
7273 { &hf_isup_parameter_type,
7274 { "Parameter Type", "isup.parameter_type",
7275 FT_UINT8, BASE_DEC, NULL, 0x0,
7278 { &hf_isup_parameter_length,
7279 { "Parameter Length", "isup.parameter_length",
7280 FT_UINT8, BASE_DEC, NULL, 0x0,
7283 { &hf_isup_mandatory_variable_parameter_pointer,
7284 { "Pointer to Parameter", "isup.mandatory_variable_parameter_pointer",
7285 FT_UINT8, BASE_DEC, NULL, 0x0,
7288 { &hf_isup_pointer_to_start_of_optional_part,
7289 { "Pointer to optional parameter part", "isup.optional_parameter_part_pointer",
7290 FT_UINT8, BASE_DEC, NULL, 0x0,
7293 { &hf_isup_satellite_indicator,
7294 { "Satellite Indicator", "isup.satellite_indicator",
7295 FT_UINT8, BASE_HEX, VALS(isup_satellite_ind_value), BA_8BIT_MASK,
7298 { &hf_isup_continuity_check_indicator,
7299 { "Continuity Check Indicator", "isup.continuity_check_indicator",
7300 FT_UINT8, BASE_HEX, VALS(isup_continuity_check_ind_value), DC_8BIT_MASK,
7303 { &hf_isup_echo_control_device_indicator,
7304 { "Echo Control Device Indicator", "isup.echo_control_device_indicator",
7305 FT_BOOLEAN, 8, TFS(&isup_echo_control_device_ind_value),E_8BIT_MASK,
7308 { &hf_isup_forw_call_natnl_inatnl_call_indicator,
7309 { "National/international call indicator", "isup.forw_call_natnl_inatnl_call_indicator",
7310 FT_BOOLEAN, 16, TFS(&isup_natnl_inatnl_call_ind_value),A_16BIT_MASK,
7313 { &hf_isup_forw_call_end_to_end_method_indicator,
7314 { "End-to-end method indicator", "isup.forw_call_end_to_end_method_indicator",
7315 FT_UINT16, BASE_HEX, VALS(isup_end_to_end_method_ind_value), CB_16BIT_MASK,
7318 { &hf_isup_forw_call_interworking_indicator,
7319 { "Interworking indicator", "isup.forw_call_interworking_indicator",
7320 FT_BOOLEAN, 16, TFS(&isup_interworking_ind_value), D_16BIT_MASK,
7323 { &hf_isup_forw_call_end_to_end_info_indicator,
7324 { "End-to-end information indicator", "isup.forw_call_end_to_end_information_indicator",
7325 FT_BOOLEAN, 16, TFS(&isup_end_to_end_info_ind_value), E_16BIT_MASK,
7328 { &hf_isup_forw_call_isdn_user_part_indicator,
7329 { "ISDN user part indicator", "isup.forw_call_isdn_user_part_indicator",
7330 FT_BOOLEAN, 16, TFS(&isup_ISDN_user_part_ind_value), F_16BIT_MASK,
7333 { &hf_isup_forw_call_preferences_indicator,
7334 { "ISDN user part preference indicator", "isup.forw_call_preferences_indicator",
7335 FT_UINT16, BASE_HEX, VALS(isup_preferences_ind_value), HG_16BIT_MASK,
7338 { &hf_isup_forw_call_isdn_access_indicator,
7339 { "ISDN access indicator", "isup.forw_call_isdn_access_indicator",
7340 FT_BOOLEAN, 16, TFS(&isup_ISDN_originating_access_ind_value), I_16BIT_MASK,
7343 { &hf_isup_forw_call_sccp_method_indicator,
7344 { "SCCP method indicator", "isup.forw_call_sccp_method_indicator",
7345 FT_UINT16, BASE_HEX, VALS(isup_SCCP_method_ind_value), KJ_16BIT_MASK,
7348 { &hf_isup_forw_call_ported_num_trans_indicator,
7349 { "Ported number translation indicator", "isup.forw_call_ported_num_trans_indicator",
7350 FT_BOOLEAN, 16, TFS(&isup_ISDN_ported_num_trans_ind_value), M_16BIT_MASK,
7353 { &hf_isup_forw_call_qor_attempt_indicator,
7354 { "Query on Release attempt indicator", "isup.forw_call_isdn_access_indicator",
7355 FT_BOOLEAN, 16, TFS(&isup_ISDN_qor_attempt_ind_value), N_16BIT_MASK,
7358 { &hf_isup_calling_partys_category,
7359 { "Calling Party's category", "isup.calling_partys_category",
7360 FT_UINT8, BASE_HEX, VALS(isup_calling_partys_category_value), 0x0,
7363 { &hf_isup_transmission_medium_requirement,
7364 { "Transmission medium requirement", "isup.transmission_medium_requirement",
7365 FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_value), 0x0,
7368 { &hf_isup_odd_even_indicator,
7369 { "Odd/even indicator", "isup.isdn_odd_even_indicator",
7370 FT_BOOLEAN, 8, TFS(&isup_odd_even_ind_value), ISUP_ODD_EVEN_MASK,
7373 { &hf_isup_generic_name_presentation,
7374 { "Presentation indicator", "isup.isdn_generic_name_presentation",
7375 FT_UINT8, BASE_DEC, VALS(isup_generic_name_presentation_value), BA_8BIT_MASK,
7378 { &hf_isup_generic_name_availability,
7379 { "Availability indicator", "isup.isdn_generic_name_availability",
7380 FT_BOOLEAN, 8, TFS(&isup_generic_name_availability_value), E_8BIT_MASK,
7383 { &hf_isup_generic_name_type,
7384 { "Type indicator", "isup.isdn_generic_name_type",
7385 FT_UINT8, BASE_DEC, VALS(isup_generic_name_type_value), HGF_8BIT_MASK,
7388 { &hf_isup_generic_name_ia5,
7389 { "Generic Name", "isup.isdn_generic_name_ia5",
7390 FT_STRING, BASE_NONE, NULL, 0x0,
7393 { &hf_isup_called_party_nature_of_address_indicator,
7394 { "Nature of address indicator", "isup.called_party_nature_of_address_indicator",
7395 FT_UINT8, BASE_DEC, VALS(isup_called_party_nature_of_address_ind_value), ISUP_NATURE_OF_ADDRESS_IND_MASK,
7398 { &hf_isup_calling_party_nature_of_address_indicator,
7399 { "Nature of address indicator", "isup.calling_party_nature_of_address_indicator",
7400 FT_UINT8, BASE_DEC, VALS(isup_calling_party_nature_of_address_ind_value), ISUP_NATURE_OF_ADDRESS_IND_MASK,
7403 { &hf_isup_charge_number_nature_of_address_indicator,
7404 { "Nature of address indicator", "isup.charge_number_nature_of_address_indicator",
7405 FT_UINT8, BASE_DEC, VALS(isup_charge_number_nature_of_address_ind_value), ISUP_NATURE_OF_ADDRESS_IND_MASK,
7408 { &hf_isup_inn_indicator,
7409 { "INN indicator", "isup.inn_indicator",
7410 FT_BOOLEAN, 8, TFS(&isup_INN_ind_value), ISUP_INN_MASK,
7413 { &hf_isup_ni_indicator,
7414 { "NI indicator", "isup.ni_indicator",
7415 FT_BOOLEAN, 8, TFS(&isup_NI_ind_value), ISUP_NI_MASK,
7418 { &hf_isup_numbering_plan_indicator,
7419 { "Numbering plan indicator", "isup.numbering_plan_indicator",
7420 FT_UINT8, BASE_DEC, VALS(isup_numbering_plan_ind_value), ISUP_NUMBERING_PLAN_IND_MASK,
7423 { &hf_isup_address_presentation_restricted_indicator,
7424 { "Address presentation restricted indicator", "isup.address_presentation_restricted_indicator",
7425 FT_UINT8, BASE_DEC, VALS(isup_address_presentation_restricted_ind_value), ISUP_ADDRESS_PRESENTATION_RESTR_IND_MASK,
7428 { &hf_isup_screening_indicator,
7429 { "Screening indicator", "isup.screening_indicator",
7430 FT_UINT8, BASE_DEC, VALS(isup_screening_ind_value), ISUP_SCREENING_IND_MASK,
7433 { &hf_isup_screening_indicator_enhanced,
7434 { "Screening indicator", "isup.screening_indicator_enhanced",
7435 FT_UINT8, BASE_DEC, VALS(isup_screening_ind_enhanced_value), ISUP_SCREENING_IND_MASK,
7438 { &hf_isup_called_party_odd_address_signal_digit,
7439 { "Address signal digit", "isup.called_party_odd_address_signal_digit",
7440 FT_UINT8, BASE_DEC, VALS(isup_called_party_address_digit_value), ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK,
7443 { &hf_isup_calling_party_odd_address_signal_digit,
7444 { "Address signal digit", "isup.calling_party_odd_address_signal_digit",
7445 FT_UINT8, BASE_DEC, VALS(isup_calling_party_address_digit_value), ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK,
7448 { &hf_isup_called_party_even_address_signal_digit,
7449 { "Address signal digit", "isup.called_party_even_address_signal_digit",
7450 FT_UINT8, BASE_DEC, VALS(isup_called_party_address_digit_value), ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK,
7453 { &hf_isup_calling_party_even_address_signal_digit,
7454 { "Address signal digit", "isup.calling_party_even_address_signal_digit",
7455 FT_UINT8, BASE_DEC, VALS(isup_calling_party_address_digit_value), ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK,
7458 { &hf_isup_calling_party_address_request_indicator,
7459 { "Calling party address request indicator", "isup.calling_party_address_request_indicator",
7460 FT_BOOLEAN, 16, TFS(&isup_calling_party_address_request_ind_value), A_16BIT_MASK,
7463 { &hf_isup_info_req_holding_indicator,
7464 { "Holding indicator", "isup.info_req_holding_indicator",
7465 FT_BOOLEAN, 16, TFS(&isup_holding_ind_value), B_16BIT_MASK,
7468 { &hf_isup_calling_partys_category_request_indicator,
7469 { "Calling party's category request indicator", "isup.calling_partys_category_request_indicator",
7470 FT_BOOLEAN, 16, TFS(&isup_calling_partys_category_request_ind_value), D_16BIT_MASK,
7473 { &hf_isup_charge_information_request_indicator,
7474 { "Charge information request indicator", "isup.charge_information_request_indicator",
7475 FT_BOOLEAN, 16, TFS(&isup_charge_information_request_ind_value), E_16BIT_MASK,
7478 { &hf_isup_malicious_call_identification_request_indicator,
7479 { "Malicious call identification request indicator (ISUP'88)", "isup.malicious_call_ident_request_indicator",
7480 FT_BOOLEAN, 16, TFS(&isup_malicious_call_identification_request_ind_value), H_16BIT_MASK,
7483 { &hf_isup_calling_party_address_response_indicator,
7484 { "Calling party address response indicator", "isup.calling_party_address_response_indicator",
7485 FT_UINT16, BASE_HEX, VALS(isup_calling_party_address_response_ind_value), BA_16BIT_MASK,
7488 { &hf_isup_OECD_inf_ind,
7489 { "OECD information indicator", "isup.OECD_inf_ind_vals",
7490 FT_UINT8, BASE_HEX, VALS(OECD_inf_ind_vals), BA_8BIT_MASK,
7493 { &hf_isup_IECD_inf_ind,
7494 { "IECD information indicator", "isup.IECD_inf_ind_vals",
7495 FT_UINT8, BASE_HEX, VALS(IECD_inf_ind_vals), DC_8BIT_MASK,
7498 { &hf_isup_OECD_req_ind,
7499 { "OECD request indicator", "isup.OECD_req_ind_vals",
7500 FT_UINT8, BASE_HEX, VALS(OECD_req_ind_vals), FE_8BIT_MASK,
7503 { &hf_isup_IECD_req_ind,
7504 { "IECD request indicator", "isup.IECD_req_ind_vals",
7505 FT_UINT8, BASE_HEX, VALS(IECD_req_ind_vals), HG_8BIT_MASK,
7508 { &hf_isup_hold_provided_indicator,
7509 { "Hold provided indicator", "isup.hold_provided_indicator",
7510 FT_BOOLEAN, 16, TFS(&isup_hold_provided_ind_value), C_16BIT_MASK,
7513 { &hf_isup_calling_partys_category_response_indicator,
7514 { "Calling party's category response indicator", "isup.calling_partys_category_response_indicator",
7515 FT_BOOLEAN, 16, TFS(&isup_calling_partys_category_response_ind_value), F_16BIT_MASK,
7518 { &hf_isup_charge_information_response_indicator,
7519 { "Charge information response indicator", "isup.charge_information_response_indicator",
7520 FT_BOOLEAN, 16, TFS(&isup_charge_information_response_ind_value), G_16BIT_MASK,
7523 { &hf_isup_solicited_indicator,
7524 { "Solicited indicator", "isup.solicided_indicator",
7525 FT_BOOLEAN, 16, TFS(&isup_solicited_information_ind_value), H_16BIT_MASK,
7528 { &hf_isup_continuity_indicator,
7529 { "Continuity indicator", "isup.continuity_indicator",
7530 FT_BOOLEAN, 8, TFS(&isup_continuity_ind_value), A_8BIT_MASK,
7533 { &hf_isup_backw_call_charge_ind,
7534 { "Charge indicator", "isup.charge_indicator",
7535 FT_UINT16, BASE_HEX, VALS(isup_charge_ind_value), BA_16BIT_MASK,
7538 { &hf_isup_backw_call_called_partys_status_ind,
7539 { "Called party's status indicator", "isup.called_partys_status_indicator",
7540 FT_UINT16, BASE_HEX, VALS(isup_called_partys_status_ind_value), DC_16BIT_MASK,
7543 { &hf_isup_backw_call_called_partys_category_ind,
7544 { "Called party's category indicator", "isup.called_partys_category_indicator",
7545 FT_UINT16, BASE_HEX, VALS(isup_called_partys_category_ind_value), FE_16BIT_MASK,
7548 { &hf_isup_backw_call_end_to_end_method_ind,
7549 { "End-to-end method indicator", "isup.backw_call_end_to_end_method_indicator",
7550 FT_UINT16, BASE_HEX, VALS(isup_end_to_end_method_ind_value), HG_16BIT_MASK,
7553 { &hf_isup_backw_call_interworking_ind,
7554 { "Interworking indicator", "isup.backw_call_interworking_indicator",
7555 FT_BOOLEAN, 16, TFS(&isup_interworking_ind_value), I_16BIT_MASK,
7558 { &hf_isup_backw_call_end_to_end_info_ind,
7559 { "End-to-end information indicator", "isup.backw_call_end_to_end_information_indicator",
7560 FT_BOOLEAN, 16, TFS(&isup_end_to_end_info_ind_value), J_16BIT_MASK,
7563 { &hf_isup_backw_call_isdn_user_part_ind,
7564 { "ISDN user part indicator", "isup.backw_call_isdn_user_part_indicator",
7565 FT_BOOLEAN, 16, TFS(&isup_ISDN_user_part_ind_value), K_16BIT_MASK,
7568 { &hf_isup_backw_call_holding_ind,
7569 { "Holding indicator", "isup.backw_call_holding_indicator",
7570 FT_BOOLEAN, 16, TFS(&isup_holding_ind_value), L_16BIT_MASK,
7573 { &hf_isup_backw_call_isdn_access_ind,
7574 { "ISDN access indicator", "isup.backw_call_isdn_access_indicator",
7575 FT_BOOLEAN, 16, TFS(&isup_ISDN_terminating_access_ind_value), M_16BIT_MASK,
7578 { &hf_isup_backw_call_echo_control_device_ind,
7579 { "Echo Control Device Indicator", "isup.backw_call_echo_control_device_indicator",
7580 FT_BOOLEAN, 16, TFS(&isup_echo_control_device_ind_value), N_16BIT_MASK,
7583 { &hf_isup_backw_call_sccp_method_ind,
7584 { "SCCP method indicator", "isup.backw_call_sccp_method_indicator",
7585 FT_UINT16, BASE_HEX, VALS(isup_SCCP_method_ind_value), PO_16BIT_MASK,
7588 { &hf_isup_cause_indicator,
7589 { "Cause indicator", "isup.cause_indicator",
7590 FT_UINT8, BASE_DEC, VALS(q850_cause_code_vals), 0x7f,
7593 { &hf_ansi_isup_cause_indicator,
7594 { "Cause indicator", "ansi_isup.cause_indicator",
7595 FT_UINT8, BASE_DEC, VALS(ansi_isup_cause_code_vals), 0x7f,
7598 { &hf_isup_suspend_resume_indicator,
7599 { "Suspend/Resume indicator", "isup.suspend_resume_indicator",
7600 FT_BOOLEAN, 8, TFS(&isup_suspend_resume_ind_value), A_8BIT_MASK,
7603 { &hf_isup_range_indicator,
7604 { "Range indicator", "isup.range_indicator",
7605 FT_UINT8, BASE_DEC, NULL , 0x0,
7608 { &hf_isup_cgs_message_type,
7609 { "Circuit group supervision message type", "isup.cgs_message_type",
7610 FT_UINT8, BASE_DEC, VALS(isup_cgs_message_type_value), BA_8BIT_MASK,
7613 { &hf_isup_mtc_blocking_state1,
7614 { "Maintenance blocking state", "isup.mtc_blocking_state",
7615 FT_UINT8, BASE_DEC, VALS(isup_mtc_blocking_state_DC00_value), BA_8BIT_MASK,
7618 { &hf_isup_mtc_blocking_state2,
7619 { "Maintenance blocking state", "isup.mtc_blocking_state",
7620 FT_UINT8, BASE_DEC, VALS(isup_mtc_blocking_state_DCnot00_value), BA_8BIT_MASK,
7623 { &hf_isup_call_proc_state,
7624 { "Call processing state", "isup.call_processing_state",
7625 FT_UINT8, BASE_DEC, VALS(isup_call_processing_state_value), DC_8BIT_MASK,
7628 { &hf_isup_hw_blocking_state,
7629 { "HW blocking state", "isup.hw_blocking_state",
7630 FT_UINT8, BASE_DEC, VALS(isup_HW_blocking_state_value), FE_8BIT_MASK,
7633 { &hf_isup_event_ind,
7634 { "Event indicator", "isup.event_ind",
7635 FT_UINT8, BASE_DEC, VALS(isup_event_ind_value), GFEDCBA_8BIT_MASK,
7638 { &hf_isup_event_presentation_restricted_ind,
7639 { "Event presentation restricted indicator", "isup.event_presentatiation_restr_ind",
7640 FT_BOOLEAN, 8, TFS(&isup_event_presentation_restricted_ind_value), H_8BIT_MASK,
7643 { &hf_isup_cug_call_ind,
7644 { "Closed user group call indicator", "isup.clg_call_ind",
7645 FT_UINT8, BASE_DEC, VALS(isup_CUG_call_ind_value), BA_8BIT_MASK,
7648 { &hf_isup_simple_segmentation_ind,
7649 { "Simple segmentation indicator", "isup.simple_segmentation_ind",
7650 FT_BOOLEAN, 8, TFS(&isup_simple_segmentation_ind_value), C_8BIT_MASK,
7653 { &hf_isup_connected_line_identity_request_ind,
7654 { "Connected line identity request indicator", "isup.connected_line_identity_request_ind",
7655 FT_BOOLEAN, 8, TFS(&isup_connected_line_identity_request_ind_value), H_8BIT_MASK,
7658 { &hf_isup_redirecting_ind,
7659 { "Redirection indicator", "isup.redirecting_ind",
7660 FT_UINT16, BASE_DEC, VALS(isup_redirecting_ind_value), CBA_16BIT_MASK,
7663 { &hf_isup_original_redirection_reason,
7664 { "Original redirection reason", "isup.original_redirection_reason",
7665 FT_UINT16, BASE_DEC, VALS(isup_original_redirection_reason_value), HGFE_16BIT_MASK,
7668 { &hf_isup_redirection_counter,
7669 { "Redirection counter", "isup.redirection_counter",
7670 FT_UINT16, BASE_DEC, NULL, KJI_16BIT_MASK,
7673 { &hf_isup_redirection_reason,
7674 { "Redirection reason", "isup.redirection_reason",
7675 FT_UINT16, BASE_DEC, VALS(isup_redirection_reason_value), PONM_16BIT_MASK,
7678 { &hf_isup_type_of_network_identification,
7679 { "Type of network identification", "isup.type_of_network_identification",
7680 FT_UINT8, BASE_DEC, VALS(isup_type_of_network_identification_value), GFE_8BIT_MASK,
7683 { &hf_isup_network_identification_plan,
7684 { "Network identification plan", "isup.network_identification_plan",
7685 FT_UINT8, BASE_DEC, VALS(isup_network_identification_plan_value), DCBA_8BIT_MASK,
7688 { &hf_isup_map_type,
7689 { "Map Type", "isup.map_type",
7690 FT_UINT8, BASE_DEC, VALS(isup_map_type_value), FEDCBA_8BIT_MASK,
7693 { &hf_isup_automatic_congestion_level,
7694 { "Automatic congestion level", "isup.automatic_congestion_level",
7695 FT_UINT8, BASE_DEC, VALS(isup_auto_congestion_level_value), 0x0,
7698 { &hf_isup_inband_information_ind,
7699 { "In-band information indicator", "isup.inband_information_ind",
7700 FT_BOOLEAN, 8, TFS(&isup_inband_information_ind_value), A_8BIT_MASK,
7703 { &hf_isup_call_diversion_may_occur_ind,
7704 { "Call diversion may occur indicator", "isup.call_diversion_may_occur_ind",
7705 FT_BOOLEAN, 8, TFS(&isup_call_diversion_may_occur_ind_value), B_8BIT_MASK,
7708 { &hf_isup_mlpp_user_ind,
7709 { "MLPP user indicator", "isup.mlpp_user",
7710 FT_BOOLEAN, 8, TFS(&isup_MLPP_user_ind_value), D_8BIT_MASK,
7713 { &hf_isup_UUI_type,
7714 { "User-to-User indicator type", "isup.UUI_type",
7715 FT_BOOLEAN, 8, TFS(&isup_UUI_type_value), A_8BIT_MASK,
7718 { &hf_isup_UUI_req_service1,
7719 { "User-to-User indicator request service 1", "isup.UUI_req_service1",
7720 FT_UINT8, BASE_DEC, VALS(isup_UUI_request_service_values), CB_8BIT_MASK,
7723 { &hf_isup_UUI_req_service2,
7724 { "User-to-User indicator request service 2", "isup.UUI_req_service2",
7725 FT_UINT8, BASE_DEC, VALS(isup_UUI_request_service_values), ED_8BIT_MASK,
7728 { &hf_isup_UUI_req_service3,
7729 { "User-to-User indicator request service 3", "isup.UUI_req_service3",
7730 FT_UINT8, BASE_DEC, VALS(isup_UUI_request_service_values), GF_8BIT_MASK,
7733 { &hf_isup_UUI_res_service1,
7734 { "User-to-User indicator response service 1", "isup.UUI_res_service1",
7735 FT_UINT8, BASE_DEC, VALS(isup_UUI_response_service_values), CB_8BIT_MASK,
7738 { &hf_isup_UUI_res_service2,
7739 { "User-to-User indicator response service 2", "isup.UUI_res_service2",
7740 FT_UINT8, BASE_DEC, VALS(isup_UUI_response_service_values), ED_8BIT_MASK,
7743 { &hf_isup_UUI_res_service3,
7744 { "User-to-User response service 3", "isup.UUI_res_service3",
7745 FT_UINT8, BASE_DEC, VALS(isup_UUI_response_service_values), GF_8BIT_MASK,
7748 { &hf_isup_UUI_network_discard_ind,
7749 { "User-to-User indicator network discard indicator", "isup.UUI_network_discard_ind",
7750 FT_BOOLEAN, 8, TFS(&isup_UUI_network_discard_ind_value), H_8BIT_MASK,
7753 { &hf_isup_access_delivery_ind,
7754 { "Access delivery indicator", "isup.access_delivery_ind",
7755 FT_BOOLEAN, 8, TFS(&isup_access_delivery_ind_value), A_8BIT_MASK,
7758 { &hf_isup_transmission_medium_requirement_prime,
7759 { "Transmission medium requirement prime", "isup.transmission_medium_requirement_prime",
7760 FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_prime_value), 0x0,
7763 { &hf_isup_loop_prevention_response_ind,
7764 { "Response indicator", "isup.loop_prevention_response_ind",
7765 FT_UINT8, BASE_DEC, VALS(isup_loop_prevention_response_ind_value), CB_8BIT_MASK,
7768 { &hf_isup_temporary_alternative_routing_ind,
7769 { "Temporary alternative routing indicator", "isup.temporary_alternative_routing_ind",
7770 FT_BOOLEAN, 8, TFS(&isup_temporary_alternative_routing_ind_value), A_8BIT_MASK,
7773 { &hf_isup_extension_ind,
7774 { "Extension indicator", "isup.extension_ind",
7775 FT_BOOLEAN, 8, TFS(&isup_extension_ind_value), H_8BIT_MASK,
7778 { &hf_isup_call_to_be_diverted_ind,
7779 { "Call to be diverted indicator", "isup.call_to_be_diverted_ind",
7780 FT_UINT8, BASE_DEC, VALS(isup_call_to_be_diverted_ind_value), BA_8BIT_MASK,
7783 { &hf_isup_call_to_be_offered_ind,
7784 { "Call to be offered indicator", "isup.call_to_be_offered_ind",
7785 FT_UINT8, BASE_DEC, VALS(isup_call_to_be_offered_ind_value), BA_8BIT_MASK,
7788 { &hf_isup_conference_acceptance_ind,
7789 { "Conference acceptance indicator", "isup.conference_acceptance_ind",
7790 FT_UINT8, BASE_DEC, VALS(isup_conference_acceptance_ind_value), BA_8BIT_MASK,
7793 { &hf_isup_transit_at_intermediate_exchange_ind,
7794 { "Transit at intermediate exchange indicator", "isup.transit_at_intermediate_exchange_ind",
7795 FT_BOOLEAN, 8, TFS(&isup_transit_at_intermediate_exchange_ind_value), A_8BIT_MASK,
7798 { &hf_isup_Release_call_ind,
7799 { "Release call indicator", "isup.Release_call_ind",
7800 FT_BOOLEAN, 8, TFS(&isup_Release_call_indicator_value), B_8BIT_MASK,
7803 { &hf_isup_Send_notification_ind,
7804 { "Send notification indicator", "isup.Send_notification_ind",
7805 FT_BOOLEAN, 8, TFS(&isup_Send_notification_ind_value),C_8BIT_MASK,
7808 { &hf_isup_Discard_message_ind_value,
7809 { "Discard message indicator","isup.Discard_message_ind_value",
7810 FT_BOOLEAN, 8, TFS(&isup_Discard_message_ind_value), D_8BIT_MASK,
7813 { &hf_isup_Discard_parameter_ind,
7814 { "Discard parameter indicator","isup.Discard_parameter_ind",
7815 FT_BOOLEAN, 8, TFS(&isup_Discard_parameter_ind_value), E_8BIT_MASK,
7818 { &hf_isup_Pass_on_not_possible_indicator,
7819 { "Pass on not possible indicator", "isup_Pass_on_not_possible_ind",
7820 FT_UINT8, BASE_HEX, VALS(isup_Pass_on_not_possible_indicator_vals),GF_8BIT_MASK,
7823 { &hf_isup_pass_on_not_possible_indicator2,
7824 { "Pass on not possible indicator", "isup_Pass_on_not_possible_val",
7825 FT_BOOLEAN, 8, TFS(&isup_pass_on_not_possible_indicator_value),E_8BIT_MASK,
7828 { &hf_isup_Broadband_narrowband_interworking_ind,
7829 { "Broadband narrowband interworking indicator Bits JF", "isup_broadband-narrowband_interworking_ind",
7830 FT_UINT8, BASE_HEX, VALS(ISUP_Broadband_narrowband_interworking_indicator_vals),BA_8BIT_MASK,
7833 { &hf_isup_Broadband_narrowband_interworking_ind2,
7834 { "Broadband narrowband interworking indicator Bits GF", "isup_broadband-narrowband_interworking_ind2",
7835 FT_UINT8, BASE_HEX, VALS(ISUP_Broadband_narrowband_interworking_indicator_vals),GF_8BIT_MASK,
7838 { &hf_isup_app_cont_ident,
7839 { "Application context identifier", "isup.app_context_identifier",
7840 FT_UINT16, BASE_DEC, VALS(isup_application_transport_parameter_value),GFEDCBA_8BIT_MASK,
7843 { &hf_isup_app_Release_call_ind,
7844 { "Release call indicator (RCI)", "isup.app_Release_call_indicator",
7845 FT_BOOLEAN, 8, TFS(&isup_Release_call_indicator_value), A_8BIT_MASK,
7848 { &hf_isup_app_Send_notification_ind,
7849 { "Send notification indicator (SNI)", "isup.app_Send_notification_ind",
7850 FT_BOOLEAN, 8, TFS(&isup_Send_notification_ind_value), B_8BIT_MASK,
7853 { &hf_isup_apm_segmentation_ind,
7854 { "APM segmentation indicator", "isup.apm_segmentation_ind",
7855 FT_UINT8, BASE_DEC, VALS(isup_APM_segmentation_ind_value), FEDCBA_8BIT_MASK,
7858 { &hf_isup_apm_si_ind,
7859 { "Sequence indicator (SI)", "isup.APM_Sequence_ind",
7860 FT_BOOLEAN, 8, TFS(&isup_Sequence_ind_value), G_8BIT_MASK,
7863 { &hf_isup_orig_addr_len,
7864 { "Originating Address length", "isup.orig_addr_len",
7865 FT_UINT8, BASE_DEC, NULL, 0x0,
7866 "Originating Address length", HFILL }},
7868 { &hf_isup_dest_addr_len,
7869 { "Destination Address length", "isup.orig_addr_len",
7870 FT_UINT8, BASE_DEC, NULL, 0x0,
7871 "Destination Address length", HFILL }},
7874 { "Segmentation local reference (SLR)", "isup.APM_slr",
7875 FT_UINT8, BASE_DEC, NULL,GFEDCBA_8BIT_MASK,
7877 { &hf_isup_cause_location,
7878 { "Cause location", "isup.cause_location",
7879 FT_UINT8, BASE_DEC, VALS(q931_cause_location_vals), 0x0f,
7882 { &hf_ansi_isup_coding_standard,
7883 { "Coding standard", "ansi_isup.coding_standard", FT_UINT8, BASE_HEX,
7884 VALS(ansi_isup_coding_standard_vals), 0x60,"", HFILL }},
7886 { &hf_bat_ase_identifier,
7887 { "BAT ASE Identifiers", "bicc.bat_ase_identifier",
7888 FT_UINT8, BASE_HEX, VALS(bat_ase_list_of_Identifiers_vals),0x0,
7891 { &hf_length_indicator,
7892 { "BAT ASE Element length indicator", "bicc.bat_ase_length_indicator",
7893 FT_UINT16, BASE_DEC, NULL,0x0,
7896 { &hf_Action_Indicator,
7897 { "BAT ASE action indicator field", "bicc.bat_ase_bat_ase_action_indicator_field",
7898 FT_UINT8, BASE_HEX, VALS(bat_ase_action_indicator_field_vals),0x00,
7901 { &hf_Instruction_ind_for_general_action,
7902 { "BAT ASE Instruction indicator for general action", "bicc.bat_ase_Instruction_ind_for_general_action",
7903 FT_UINT8, BASE_HEX, VALS(Instruction_indicator_for_general_action_vals),0x03,
7906 { &hf_Send_notification_ind_for_general_action,
7907 { "Send notification indicator for general action", "bicc.bat_ase_Send_notification_ind_for_general_action",
7908 FT_BOOLEAN, 8, TFS(&isup_Send_notification_ind_value), 0x04,
7911 { &hf_Instruction_ind_for_pass_on_not_possible,
7912 { "Instruction ind for pass-on not possible", "bicc.bat_ase_Instruction_ind_for_pass_on_not_possible",
7913 FT_UINT8, BASE_HEX, VALS(Instruction_indicator_for_pass_on_not_possible_vals),0x30,
7916 { &hf_Send_notification_ind_for_pass_on_not_possible,
7917 { "Send notification indication for pass-on not possible", "bicc.bat_ase_Send_notification_ind_for_pass_on_not_possible",
7918 FT_BOOLEAN, 8, TFS(&isup_Send_notification_ind_value), 0x40,
7921 { &hf_BCTP_Version_Indicator,
7922 { "BCTP Version Indicator", "bicc.bat_ase_BCTP_Version_Indicator",
7923 FT_UINT8, BASE_DEC, NULL,0x1f,
7927 { "BVEI", "bicc.bat_ase_BCTP_BVEI",
7928 FT_BOOLEAN, 8, TFS(&BCTP_BVEI_value), 0x40,
7931 { &hf_Tunnelled_Protocol_Indicator,
7932 { "Tunnelled Protocol Indicator", "bicc.bat_ase_BCTP_Tunnelled_Protocol_Indicator",
7933 FT_UINT8, BASE_DEC, VALS(BCTP_Tunnelled_Protocol_Indicator_vals),0x3f,
7937 { "TPEI", "bicc.bat_ase_BCTP_tpei",
7938 FT_BOOLEAN, 8, TFS(&BCTP_TPEI_value), 0x40,
7942 { "Backbone Network Connection Identifier (BNCId)", "bat_ase.bncid",
7943 FT_UINT32, BASE_HEX, NULL, 0x0,
7946 { &hf_bat_ase_biwfa,
7947 { "Interworking Function Address( X.213 NSAP encoded)", "bat_ase_biwfa",
7948 FT_BYTES, BASE_HEX, NULL, 0x0,
7952 { "X.213 Address Format Information ( AFI )", "x213.afi",
7953 FT_UINT8, BASE_HEX, VALS(x213_afi_value),0x0,
7956 { &hf_bicc_nsap_dsp,
7957 { "X.213 Address Format Information ( DSP )", "x213.dsp",
7958 FT_BYTES, BASE_HEX, NULL,0x0,
7960 { &hf_characteristics,
7961 { "Backbone network connection characteristics", "bat_ase.char",
7962 FT_UINT8, BASE_HEX, VALS(bearer_network_connection_characteristics_vals),0x0,
7965 { &hf_Organization_Identifier,
7966 { "Organization identifier subfield ", "bat_ase.organization_identifier_subfield",
7967 FT_UINT8, BASE_DEC, VALS(bat_ase_organization_identifier_subfield_vals),0x0,
7971 { "ITU-T codec type subfield", "bat_ase.ITU_T_codec_type_subfield",
7972 FT_UINT8, BASE_HEX, VALS(ITU_T_codec_type_subfield_vals),0x0,
7975 { &hf_etsi_codec_type,
7976 { "ETSI codec type subfield", "bat_ase.ETSI_codec_type_subfield",
7977 FT_UINT8, BASE_HEX, VALS(ETSI_codec_type_subfield_vals),0x0,
7980 { &hf_active_code_set,
7981 { "Active Code Set", "bat_ase.acs",
7982 FT_UINT8, BASE_HEX, NULL,0x0,
7985 { &hf_active_code_set_12_2,
7986 { "12.2 kbps rate", "bat_ase.acs.12_2",
7987 FT_UINT8, BASE_HEX, NULL,0x80,
7990 { &hf_active_code_set_10_2,
7991 { "10.2 kbps rate", "bat_ase.acs.10_2",
7992 FT_UINT8, BASE_HEX, NULL,0x40,
7995 { &hf_active_code_set_7_95,
7996 { "7.95 kbps rate", "bat_ase.acs.7_95",
7997 FT_UINT8, BASE_HEX, NULL,0x20,
8000 { &hf_active_code_set_7_40,
8001 { "7.40 kbps rate", "bat_ase.acs.7_40",
8002 FT_UINT8, BASE_HEX, NULL,0x10,
8005 { &hf_active_code_set_6_70,
8006 { "6.70 kbps rate", "bat_ase.acs.6_70",
8007 FT_UINT8, BASE_HEX, NULL,0x08,
8010 { &hf_active_code_set_5_90,
8011 { "5.90 kbps rate", "bat_ase.acs.5_90",
8012 FT_UINT8, BASE_HEX, NULL,0x04,
8015 { &hf_active_code_set_5_15,
8016 { "5.15 kbps rate", "bat_ase.acs.5_15",
8017 FT_UINT8, BASE_HEX, NULL,0x02,
8020 { &hf_active_code_set_4_75,
8021 { "4.75 kbps rate", "bat_ase.acs.4_75",
8022 FT_UINT8, BASE_HEX, NULL,0x01,
8025 { &hf_supported_code_set,
8026 { "Supported Code Set", "bat_ase.scs",
8027 FT_UINT8, BASE_HEX, NULL,0x0,
8030 { &hf_supported_code_set_12_2,
8031 { "12.2 kbps rate", "bat_ase.scs.12_2",
8032 FT_UINT8, BASE_HEX, NULL,0x80,
8035 { &hf_supported_code_set_10_2,
8036 { "10.2 kbps rate", "bat_ase.scs.10_2",
8037 FT_UINT8, BASE_HEX, NULL,0x40,
8040 { &hf_supported_code_set_7_95,
8041 { "7.95 kbps rate", "bat_ase.scs.7_95",
8042 FT_UINT8, BASE_HEX, NULL,0x20,
8045 { &hf_supported_code_set_7_40,
8046 { "7.40 kbps rate", "bat_ase.scs.7_40",
8047 FT_UINT8, BASE_HEX, NULL,0x10,
8050 { &hf_supported_code_set_6_70,
8051 { "6.70 kbps rate", "bat_ase.scs.6_70",
8052 FT_UINT8, BASE_HEX, NULL,0x08,
8055 { &hf_supported_code_set_5_90,
8056 { "5.90 kbps rate", "bat_ase.scs.5_90",
8057 FT_UINT8, BASE_HEX, NULL,0x04,
8060 { &hf_supported_code_set_5_15,
8061 { "5.15 kbps rate", "bat_ase.scs.5_15",
8062 FT_UINT8, BASE_HEX, NULL,0x02,
8065 { &hf_supported_code_set_4_75,
8066 { "4.75 kbps rate", "bat_ase.scs.4_75",
8067 FT_UINT8, BASE_HEX, NULL,0x01,
8070 { &hf_optimisation_mode,
8071 { "Optimisation Mode for ACS , OM", "bat_ase.optimisation_mode",
8072 FT_UINT8, BASE_HEX, VALS(optimisation_mode_vals),0x8,
8073 "Optimisation Mode for ACS , OM", HFILL }},
8075 { &hf_max_codec_modes,
8076 { "Maximal number of Codec Modes, MACS", "bat_ase.macs",
8077 FT_UINT8, BASE_DEC, NULL,0x07,
8078 "Maximal number of Codec Modes, MACS", HFILL }},
8081 { &hf_bearer_control_tunneling,
8082 { "Bearer control tunneling", "bat_ase.bearer_control_tunneling",
8083 FT_BOOLEAN, 8, TFS(&Bearer_Control_Tunnelling_ind_value),0x01,
8086 { &hf_BAT_ASE_Comp_Report_Reason,
8087 { "Compatibility report reason", "bat_ase.Comp_Report_Reason",
8088 FT_UINT8, BASE_HEX, VALS(BAT_ASE_Report_Reason_vals),0x0,
8092 { &hf_BAT_ASE_Comp_Report_ident,
8093 { "Bearer control tunneling", "bat_ase.bearer_control_tunneling",
8094 FT_UINT8, BASE_HEX, VALS(bat_ase_list_of_Identifiers_vals),0x0,
8097 { &hf_BAT_ASE_Comp_Report_diagnostic,
8098 { "Diagnostics", "bat_ase.Comp_Report_diagnostic",
8099 FT_UINT16, BASE_HEX, NULL,0x0,
8103 { "Local BCU ID", "bat_ase.Local_BCU_ID",
8104 FT_UINT32, BASE_HEX, NULL, 0x0,
8107 { &hf_late_cut_trough_cap_ind,
8108 { "Late Cut-through capability indicator", "bat_ase.late_cut_trough_cap_ind",
8109 FT_BOOLEAN, 8, TFS(&late_cut_trough_cap_ind_value),0x01,
8112 { &hf_bat_ase_signal,
8113 { "Q.765.5 - Signal Type", "bat_ase.signal_type",
8114 FT_UINT8, BASE_HEX, VALS(BAt_ASE_Signal_Type_vals),0x0,
8117 { &hf_bat_ase_duration,
8118 { "Duration in ms", "bat_ase.signal_type",
8119 FT_UINT16, BASE_DEC, NULL,0x0,
8122 { &hf_bat_ase_bearer_redir_ind,
8123 { "Redirection Indicator", "bat_ase.bearer_redir_ind",
8124 FT_UINT8, BASE_HEX, VALS(Bearer_Redirection_Indicator_vals),0x0,
8127 { &hf_nsap_ipv4_addr,
8128 { "IWFA IPv4 Address", "nsap.ipv4_addr",
8129 FT_IPv4, BASE_NONE, NULL, 0x0,
8130 "IPv4 address", HFILL }},
8132 { &hf_nsap_ipv6_addr,
8133 { "IWFA IPv6 Address", "nsap.ipv6_addr",
8134 FT_IPv6, BASE_NONE, NULL, 0x0,
8135 "IPv6 address", HFILL}},
8138 { "IANA ICP", "nsap.iana_icp",
8139 FT_UINT16, BASE_HEX, VALS(iana_icp_values),0x0,
8143 { "ISUP Called Number", "isup.called",
8144 FT_STRING, BASE_NONE, NULL,0x0,
8148 { "ISUP Calling Number", "isup.calling",
8149 FT_STRING, BASE_NONE, NULL,0x0,
8152 { &hf_isup_redirecting,
8153 { "ISUP Redirecting Number", "isup.redirecting",
8154 FT_STRING, BASE_NONE, NULL,0x0,
8156 {&hf_isup_apm_msg_fragments,
8157 {"Message fragments", "isup_apm.msg.fragments",
8158 FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL }
8160 {&hf_isup_apm_msg_fragment,
8161 {"Message fragment", "isup_apm.msg.fragment",
8162 FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL }
8164 {&hf_isup_apm_msg_fragment_overlap,
8165 {"Message fragment overlap", "isup_apm.msg.fragment.overlap",
8166 FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL }
8168 {&hf_isup_apm_msg_fragment_overlap_conflicts,
8169 {"Message fragment overlapping with conflicting data","isup_apm.msg.fragment.overlap.conflicts",
8170 FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL }
8172 {&hf_isup_apm_msg_fragment_multiple_tails,
8173 {"Message has multiple tail fragments", "isup_apm.msg.fragment.multiple_tails",
8174 FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL }
8176 {&hf_isup_apm_msg_fragment_too_long_fragment,
8177 {"Message fragment too long", "isup_apm.msg.fragment.too_long_fragment",
8178 FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL }
8180 {&hf_isup_apm_msg_fragment_error,
8181 {"Message defragmentation error", "isup_apm.msg.fragment.error",
8182 FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL }
8184 {&hf_isup_apm_msg_reassembled_in,
8185 {"Reassembled in", "isup_apm.msg.reassembled.in",
8186 FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL }
8188 {&hf_isup_cvr_rsp_ind,
8189 {"CVR Response Ind", "conn_rsp_ind",
8190 FT_UINT8, BASE_DEC, VALS(isup_cvr_rsp_ind_value), BA_8BIT_MASK,
8192 {&hf_isup_cvr_cg_car_ind,
8193 {"CVR Circuit Group Carrier","cg_carrier_ind",
8194 FT_UINT8, BASE_HEX, VALS(isup_cvr_cg_car_ind_value), BA_8BIT_MASK,
8196 {&hf_isup_cvr_cg_double_seize,
8197 {"Double Seize Control", "cg_char_ind.doubleSeize",
8198 FT_UINT8, BASE_HEX, VALS(isup_cvr_cg_double_seize_value), DC_8BIT_MASK,
8200 {&hf_isup_cvr_cg_alarm_car_ind,
8201 {"Alarm Carrier Indicator", "cg_alarm_car_ind",
8202 FT_UINT8, BASE_HEX, VALS(isup_cvr_alarm_car_ind_value), FE_8BIT_MASK,
8204 {&hf_isup_cvr_cont_chk_ind,
8205 {"Continuity Check Indicator","cg_alarm_cnt_chk",
8206 FT_UINT8, BASE_HEX, VALS(isup_cvr_cont_chk_ind_value), HG_8BIT_MASK,
8209 { &hf_isup_geo_loc_presentation_restricted_ind,
8210 { "Calling Geodetic Location presentation restricted indicator", "isup.location_presentation_restr_ind",
8211 FT_UINT8, BASE_DEC, VALS(isup_location_presentation_restricted_ind_value), DC_8BIT_MASK,
8213 { &hf_isup_geo_loc_screening_ind,
8214 { "Calling Geodetic Location screening indicator", "isup.location_screening_ind",
8215 FT_UINT8, BASE_DEC, VALS(isup_screening_ind_enhanced_value), BA_8BIT_MASK, /* using previously defined screening values */
8219 /* Setup protocol subtree array */
8220 static gint *ett[] = {
8222 &ett_isup_parameter,
8223 &ett_isup_address_digits,
8224 &ett_isup_pass_along_message,
8225 &ett_isup_circuit_state_ind,
8227 &ett_bat_ase_element,
8231 &ett_isup_apm_msg_fragment,
8232 &ett_isup_apm_msg_fragments,
8235 /* Register the protocol name and description */
8236 proto_isup = proto_register_protocol("ISDN User Part",
8239 register_dissector("isup", dissect_isup, proto_isup);
8241 /* Required function calls to register the header fields and subtrees used */
8242 proto_register_field_array(proto_isup, hf, array_length(hf));
8243 proto_register_subtree_array(ett, array_length(ett));
8245 isup_tap = register_tap("isup");
8247 isup_module = prefs_register_protocol(proto_isup, NULL);
8250 prefs_register_bool_preference(isup_module, "show_cic_in_info", "Show CIC in Info column",
8251 "Show the CIC value (in addition to the message type) in the Info column",
8252 (gint *)&isup_show_cic_in_info);
8254 prefs_register_bool_preference(isup_module, "defragment_apm",
8255 "Reassemble APM messages",
8256 "Whether APM messages datagrams should be reassembled",
8257 &isup_apm_desegment);
8259 /* Register the stats_tree */
8260 stats_tree_register_with_group("isup", "isup_msg", "ISUP Messages",
8261 0, msg_stats_tree_packet, msg_stats_tree_init,
8262 NULL, REGISTER_STAT_GROUP_TELEPHONY);
8266 /* ------------------------------------------------------------------ */
8267 /* Register isup with the sub-laying MTP L3 dissector */
8269 proto_reg_handoff_isup(void)
8271 dissector_handle_t isup_handle;
8272 dissector_handle_t application_isup_handle;
8274 isup_handle = create_dissector_handle(dissect_isup, proto_isup);
8275 application_isup_handle = create_dissector_handle(dissect_application_isup, proto_isup);
8276 dissector_add("mtp3.service_indicator", MTP3_ISUP_SERVICE_INDICATOR, isup_handle);
8277 dissector_add_string("media_type","application/isup", application_isup_handle);
8278 dissector_add_string("tali.opcode", "isot", isup_handle);
8283 proto_register_bicc(void)
8285 /* Setup list of header fields See Section 1.6.1 for details*/
8286 static hf_register_info hf[] = {
8288 { "Call identification Code (CIC)", "bicc.cic",
8289 FT_UINT32, BASE_HEX, NULL, 0x0,
8293 /* Setup protocol subtree array */
8294 static gint *ett[] = {
8297 proto_bicc = proto_register_protocol("Bearer Independent Call Control ",
8299 /* Required function calls to register the header fields and subtrees used */
8300 proto_register_field_array(proto_bicc, hf, array_length(hf));
8301 proto_register_subtree_array(ett, array_length(ett));
8303 register_init_routine(isup_apm_defragment_init);
8306 /* Register isup with the sub-laying MTP L3 dissector */
8308 proto_reg_handoff_bicc(void)
8310 dissector_handle_t bicc_handle;
8311 sdp_handle = find_dissector("sdp");
8312 q931_ie_handle = find_dissector("q931.ie");
8314 bicc_handle = create_dissector_handle(dissect_bicc, proto_bicc);
8315 dissector_add("mtp3.service_indicator", MTP3_BICC_SERVICE_INDICATOR, bicc_handle);
8316 dissector_add("sctp.ppi", BICC_PAYLOAD_PROTOCOL_ID, bicc_handle);