"uint" is defined on all platforms; use "guint" instead.
[obnox/wireshark/wip.git] / packet-isup.c
1 /* packet-ISUP.c
2  * Routines for ISUP dissection
3  * Copyright 2001, Martina Obermeier <martina.obermeier@icn.siemens.de>
4  *
5  * $Id: packet-isup.c,v 1.12 2002/05/02 09:52:20 guy Exp $
6  *
7  * Ethereal - Network traffic analyzer
8  * By Gerald Combs <gerald@ethereal.com>
9  * Copyright 1998 Gerald Combs
10  *
11  * Copied from README.developer
12  * 
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  * 
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  * 
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26  */
27
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35
36 #ifdef HAVE_SYS_TYPES_H
37 # include <sys/types.h>
38 #endif
39
40 #ifdef HAVE_NETINET_IN_H
41 # include <netinet/in.h>
42 #endif
43
44 #include <glib.h>
45
46 #ifdef NEED_SNPRINTF_H
47 # include "snprintf.h"
48 #endif
49
50 #include <epan/packet.h>
51 #include "packet-ip.h"
52
53 #define MTP3_ISUP_SERVICE_INDICATOR     5
54 #define ASCII_NUMBER_DELTA              0x30
55 #define ASCII_LETTER_DELTA              0x37
56
57 /* Definition of protocol field values und lengths */
58
59 /* Definition of Message Types */
60 #define MESSAGE_TYPE_INITIAL_ADDR       1
61 #define MESSAGE_TYPE_SUBSEQ_ADDR        2
62 #define MESSAGE_TYPE_INFO_REQ           3
63 #define MESSAGE_TYPE_INFO               4
64 #define MESSAGE_TYPE_CONTINUITY         5
65 #define MESSAGE_TYPE_ADDR_CMPL          6
66 #define MESSAGE_TYPE_CONNECT            7
67 #define MESSAGE_TYPE_FORW_TRANS         8
68 #define MESSAGE_TYPE_ANSWER             9
69 #define MESSAGE_TYPE_RELEASE           12 
70 #define MESSAGE_TYPE_SUSPEND           13
71 #define MESSAGE_TYPE_RESUME            14 
72 #define MESSAGE_TYPE_REL_CMPL          16
73 #define MESSAGE_TYPE_CONT_CHECK_REQ    17
74 #define MESSAGE_TYPE_RESET_CIRCUIT     18
75 #define MESSAGE_TYPE_BLOCKING          19
76 #define MESSAGE_TYPE_UNBLOCKING        20
77 #define MESSAGE_TYPE_BLOCK_ACK         21
78 #define MESSAGE_TYPE_UNBLOCK_ACK       22
79 #define MESSAGE_TYPE_CIRC_GRP_RST      23
80 #define MESSAGE_TYPE_CIRC_GRP_BLCK     24
81 #define MESSAGE_TYPE_CIRC_GRP_UNBL     25
82 #define MESSAGE_TYPE_CIRC_GRP_BL_ACK   26
83 #define MESSAGE_TYPE_CIRC_GRP_UNBL_ACK 27 
84 #define MESSAGE_TYPE_FACILITY_REQ      31
85 #define MESSAGE_TYPE_FACILITY_ACC      32
86 #define MESSAGE_TYPE_FACILITY_REJ      33
87 #define MESSAGE_TYPE_LOOP_BACK_ACK     36
88 #define MESSAGE_TYPE_PASS_ALONG        40
89 #define MESSAGE_TYPE_CIRC_GRP_RST_ACK  41
90 #define MESSAGE_TYPE_CIRC_GRP_QRY      42
91 #define MESSAGE_TYPE_CIRC_GRP_QRY_RSP  43
92 #define MESSAGE_TYPE_CALL_PROGRSS      44
93 #define MESSAGE_TYPE_USER2USER_INFO    45
94 #define MESSAGE_TYPE_UNEQUIPPED_CIC    46
95 #define MESSAGE_TYPE_CONFUSION         47
96 #define MESSAGE_TYPE_OVERLOAD          48
97 #define MESSAGE_TYPE_CHARGE_INFO       49
98 #define MESSAGE_TYPE_NETW_RESRC_MGMT   50
99 #define MESSAGE_TYPE_FACILITY          51
100 #define MESSAGE_TYPE_USER_PART_TEST    52
101 #define MESSAGE_TYPE_USER_PART_AVAIL   53
102 #define MESSAGE_TYPE_IDENT_REQ         54
103 #define MESSAGE_TYPE_IDENT_RSP         55 
104 #define MESSAGE_TYPE_SEGMENTATION      56
105 #define MESSAGE_TYPE_LOOP_PREVENTION   64
106
107 static const value_string isup_message_type_value[] = {
108   { MESSAGE_TYPE_INITIAL_ADDR,          "Initial address"},
109   { MESSAGE_TYPE_SUBSEQ_ADDR,           "Subsequent address"},
110   { MESSAGE_TYPE_INFO_REQ,              "Information request (national use)"},
111   { MESSAGE_TYPE_INFO,                  "Information (national use)"},
112   { MESSAGE_TYPE_CONTINUITY,            "Continuity"},
113   { MESSAGE_TYPE_ADDR_CMPL,             "Address complete"},
114   { MESSAGE_TYPE_CONNECT,               "Connect"},
115   { MESSAGE_TYPE_FORW_TRANS,            "Forward transfer"},
116   { MESSAGE_TYPE_ANSWER,                "Answer"},
117   { MESSAGE_TYPE_RELEASE,               "Release"},
118   { MESSAGE_TYPE_SUSPEND,               "Suspend"},
119   { MESSAGE_TYPE_RESUME,                "Resume"},
120   { MESSAGE_TYPE_REL_CMPL,              "Release complete"},
121   { MESSAGE_TYPE_CONT_CHECK_REQ,        "Continuity check request"},
122   { MESSAGE_TYPE_RESET_CIRCUIT,         "Reset Circuit"},
123   { MESSAGE_TYPE_BLOCKING,              "Blocking"},
124   { MESSAGE_TYPE_UNBLOCKING,            "Unblocking"},
125   { MESSAGE_TYPE_BLOCK_ACK,             "Blocking acknowledgement"},
126   { MESSAGE_TYPE_UNBLOCK_ACK,           "Unblocking acknowledgment"},
127   { MESSAGE_TYPE_CIRC_GRP_RST,          "Circuit group reset"},
128   { MESSAGE_TYPE_CIRC_GRP_BLCK,         "Circuit group blocking"},
129   { MESSAGE_TYPE_CIRC_GRP_UNBL,         "Circuit group unblocking"},
130   { MESSAGE_TYPE_CIRC_GRP_BL_ACK,       "Circuit group blocking acknowledgement"},
131   { MESSAGE_TYPE_CIRC_GRP_UNBL_ACK,     "Circuit group unblocking acknowledgement"},
132   { MESSAGE_TYPE_FACILITY_REQ,          "Facility request"},
133   { MESSAGE_TYPE_FACILITY_ACC,          "Facility accepted"},
134   { MESSAGE_TYPE_FACILITY_REJ,          "Facility reject"},
135   { MESSAGE_TYPE_LOOP_BACK_ACK,         "Loop back acknowledgement (national use)"},
136   { MESSAGE_TYPE_PASS_ALONG,            "Pass-along (national use)"},
137   { MESSAGE_TYPE_CIRC_GRP_RST_ACK,      "Circuit group reset acknowledgement"},
138   { MESSAGE_TYPE_CIRC_GRP_QRY,          "Circuit group query (national use)"},
139   { MESSAGE_TYPE_CIRC_GRP_QRY_RSP,      "Circuit group query response (national use)"},
140   { MESSAGE_TYPE_CALL_PROGRSS,          "Call progress"},
141   { MESSAGE_TYPE_USER2USER_INFO,        "User-to-user information"},
142   { MESSAGE_TYPE_UNEQUIPPED_CIC,        "Unequipped CIC (national use)"},
143   { MESSAGE_TYPE_CONFUSION,             "Confusion"},
144   { MESSAGE_TYPE_OVERLOAD,              "Overload (national use)"},
145   { MESSAGE_TYPE_CHARGE_INFO,           "Charge information (national use)"},
146   { MESSAGE_TYPE_NETW_RESRC_MGMT,       "Network resource management"},
147   { MESSAGE_TYPE_FACILITY,              "Facility"},
148   { MESSAGE_TYPE_USER_PART_TEST,        "User part test"},
149   { MESSAGE_TYPE_USER_PART_AVAIL,       "User part available"},
150   { MESSAGE_TYPE_IDENT_REQ,             "Identification request"},
151   { MESSAGE_TYPE_IDENT_RSP,             "Identification response"},
152   { MESSAGE_TYPE_SEGMENTATION,          "Segmentation"},
153   { MESSAGE_TYPE_LOOP_PREVENTION,       "Loop prevention"},
154   { 0,                                  NULL}};
155
156 /* Definition of Parameter Types */
157 #define PARAM_TYPE_END_OF_OPT_PARAMS      0
158 #define PARAM_TYPE_CALL_REF               1
159 #define PARAM_TYPE_TRANSM_MEDIUM_REQU     2
160 #define PARAM_TYPE_ACC_TRANSP             3
161 #define PARAM_TYPE_CALLED_PARTY_NR        4
162 #define PARAM_TYPE_SUBSQT_NR              5
163 #define PARAM_TYPE_NATURE_OF_CONN_IND     6
164 #define PARAM_TYPE_FORW_CALL_IND          7
165 #define PARAM_TYPE_OPT_FORW_CALL_IND      8
166 #define PARAM_TYPE_CALLING_PRTY_CATEG     9
167 #define PARAM_TYPE_CALLING_PARTY_NR      10
168 #define PARAM_TYPE_REDIRECTING_NR        11
169 #define PARAM_TYPE_REDIRECTION_NR        12
170 #define PARAM_TYPE_CONNECTION_REQ        13
171 #define PARAM_TYPE_INFO_REQ_IND          14
172 #define PARAM_TYPE_INFO_IND              15
173 #define PARAM_TYPE_CONTINUITY_IND        16
174 #define PARAM_TYPE_BACKW_CALL_IND        17
175 #define PARAM_TYPE_CAUSE_INDICATORS      18
176 #define PARAM_TYPE_REDIRECTION_INFO      19
177 #define PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE  21
178 #define PARAM_TYPE_RANGE_AND_STATUS      22
179 #define PARAM_TYPE_FACILITY_IND          24
180 #define PARAM_TYPE_CLSD_USR_GRP_ILOCK_CD 26
181 #define PARAM_TYPE_USER_SERVICE_INFO     29
182 #define PARAM_TYPE_SIGNALLING_POINT_CODE 30
183 #define PARAM_TYPE_USER_TO_USER_INFO     32
184 #define PARAM_TYPE_CONNECTED_NR          33
185 #define PARAM_TYPE_SUSP_RESUME_IND       34
186 #define PARAM_TYPE_TRANSIT_NETW_SELECT   35
187 #define PARAM_TYPE_EVENT_INFO            36
188 #define PARAM_TYPE_CIRC_ASSIGN_MAP       37
189 #define PARAM_TYPE_CIRC_STATE_IND        38
190 #define PARAM_TYPE_AUTO_CONG_LEVEL       39
191 #define PARAM_TYPE_ORIG_CALLED_NR        40
192 #define PARAM_TYPE_OPT_BACKW_CALL_IND    41
193 #define PARAM_TYPE_USER_TO_USER_IND      42
194 #define PARAM_TYPE_ORIG_ISC_POINT_CODE   43
195 #define PARAM_TYPE_GENERIC_NOTIF_IND     44
196 #define PARAM_TYPE_CALL_HIST_INFO        45 
197 #define PARAM_TYPE_ACC_DELIV_INFO        46
198 #define PARAM_TYPE_NETW_SPECIFIC_FACLTY  47
199 #define PARAM_TYPE_USER_SERVICE_INFO_PR  48
200 #define PARAM_TYPE_PROPAG_DELAY_COUNTER  49
201 #define PARAM_TYPE_REMOTE_OPERATIONS     50
202 #define PARAM_TYPE_SERVICE_ACTIVATION    51
203 #define PARAM_TYPE_USER_TELESERV_INFO    52
204 #define PARAM_TYPE_TRANSM_MEDIUM_USED    53
205 #define PARAM_TYPE_CALL_DIV_INFO         54
206 #define PARAM_TYPE_ECHO_CTRL_INFO        55
207 #define PARAM_TYPE_MSG_COMPAT_INFO       56
208 #define PARAM_TYPE_PARAM_COMPAT_INFO     57
209 #define PARAM_TYPE_MLPP_PRECEDENCE       58  
210 #define PARAM_TYPE_MCID_REQ_IND          59
211 #define PARAM_TYPE_MCID_RSP_IND          60
212 #define PARAM_TYPE_HOP_COUNTER           61
213 #define PARAM_TYPE_TRANSM_MEDIUM_RQUR_PR 62
214 #define PARAM_TYPE_LOCATION_NR           63
215 #define PARAM_TYPE_REDIR_NR_RSTRCT       64
216 #define PARAM_TYPE_CALL_TRANS_REF        67
217 #define PARAM_TYPE_LOOP_PREV_IND         68
218 #define PARAM_TYPE_CALL_TRANS_NR         69
219 #define PARAM_TYPE_CCSS                  75
220 #define PARAM_TYPE_FORW_GVNS             76
221 #define PARAM_TYPE_BACKW_GVNS            77
222 #define PARAM_TYPE_REDIRECT_CAPAB        78
223 #define PARAM_TYPE_NETW_MGMT_CTRL        91
224 #define PARAM_TYPE_CORRELATION_ID       101
225 #define PARAM_TYPE_SCF_ID               102
226 #define PARAM_TYPE_CALL_DIV_TREAT_IND   110
227 #define PARAM_TYPE_CALLED_IN_NR         111
228 #define PARAM_TYPE_CALL_OFF_TREAT_IND   112
229 #define PARAM_TYPE_CHARGED_PARTY_IDENT  113
230 #define PARAM_TYPE_CONF_TREAT_IND       114
231 #define PARAM_TYPE_DISPLAY_INFO         115
232 #define PARAM_TYPE_UID_ACTION_IND       116
233 #define PARAM_TYPE_UID_CAPAB_IND        117
234 #define PARAM_TYPE_REDIRECT_COUNTER     119
235 #define PARAM_TYPE_COLLECT_CALL_REQ     121
236 #define PARAM_TYPE_GENERIC_NR           192
237 #define PARAM_TYPE_GENERIC_DIGITS       193
238
239 static const value_string isup_parameter_type_value[] = {
240 { PARAM_TYPE_END_OF_OPT_PARAMS,        "End of optional parameters"},
241   { PARAM_TYPE_CALL_REF,               "Call Reference (national use)"},
242   { PARAM_TYPE_TRANSM_MEDIUM_REQU,     "Transmission medium requirement"},
243   { PARAM_TYPE_ACC_TRANSP,             "Access transport"},
244   { PARAM_TYPE_CALLED_PARTY_NR,        "Called party number"},
245   { PARAM_TYPE_SUBSQT_NR,              "Subsequent number"},
246   { PARAM_TYPE_NATURE_OF_CONN_IND,     "Nature of connection indicators"},
247   { PARAM_TYPE_FORW_CALL_IND,          "Forward call indicators"},
248   { PARAM_TYPE_OPT_FORW_CALL_IND,      "Optional forward call indicators"},
249   { PARAM_TYPE_CALLING_PRTY_CATEG,     "Calling party's category"},
250   { PARAM_TYPE_CALLING_PARTY_NR,       "Calling party number"},
251   { PARAM_TYPE_REDIRECTING_NR,         "Redirecting number"},
252   { PARAM_TYPE_REDIRECTION_NR,         "Redirection number"},
253   { PARAM_TYPE_CONNECTION_REQ,         "Connection request"},
254   { PARAM_TYPE_INFO_REQ_IND,           "Information request indicators (national use)"},
255   { PARAM_TYPE_INFO_IND,               "Information indicators (national use)"},
256   { PARAM_TYPE_CONTINUITY_IND,         "Continuity request"},
257   { PARAM_TYPE_BACKW_CALL_IND,         "Backward call indicators"},
258   { PARAM_TYPE_CAUSE_INDICATORS,       "Cause indicators"},
259   { PARAM_TYPE_REDIRECTION_INFO,       "Redirection information"},
260   { PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE,   "Circuit group supervision message type"},
261   { PARAM_TYPE_RANGE_AND_STATUS,       "Range and Status"},
262   { PARAM_TYPE_FACILITY_IND,           "Facility indicator"},
263   { PARAM_TYPE_CLSD_USR_GRP_ILOCK_CD,  "Closed user group interlock code"},
264   { PARAM_TYPE_USER_SERVICE_INFO,      "User service information"},
265   { PARAM_TYPE_SIGNALLING_POINT_CODE,  "Signalling point code (national use)"},
266   { PARAM_TYPE_USER_TO_USER_INFO,      "User-to-user information"},
267   { PARAM_TYPE_CONNECTED_NR,           "Connected number"},
268   { PARAM_TYPE_SUSP_RESUME_IND,        "Suspend/Resume indicators"},
269   { PARAM_TYPE_TRANSIT_NETW_SELECT,    "Transit network selection (national use)"},
270   { PARAM_TYPE_EVENT_INFO,             "Event information"},
271   { PARAM_TYPE_CIRC_ASSIGN_MAP,        "Circuit assignment map"},
272   { PARAM_TYPE_CIRC_STATE_IND,         "Circuit state indicator (national use)"},
273   { PARAM_TYPE_AUTO_CONG_LEVEL,        "Automatic congestion level"},
274   { PARAM_TYPE_ORIG_CALLED_NR,         "Original called number"},
275   { PARAM_TYPE_OPT_BACKW_CALL_IND,     "Backward call indicators"},
276   { PARAM_TYPE_USER_TO_USER_IND,       "User-to-user indicators"},
277   { PARAM_TYPE_ORIG_ISC_POINT_CODE,    "Origination ISC point code"},
278   { PARAM_TYPE_GENERIC_NOTIF_IND,      "Generic notification indicator"},
279   { PARAM_TYPE_CALL_HIST_INFO,         "Call history information"},
280   { PARAM_TYPE_ACC_DELIV_INFO,         "Access delivery information"},
281   { PARAM_TYPE_NETW_SPECIFIC_FACLTY,   "Network specific facility (national use)"},
282   { PARAM_TYPE_USER_SERVICE_INFO_PR,   "User service information prime"},
283   { PARAM_TYPE_PROPAG_DELAY_COUNTER,   "Propagation delay counter"},
284   { PARAM_TYPE_REMOTE_OPERATIONS,      "Remote operations (national use)"},
285   { PARAM_TYPE_SERVICE_ACTIVATION,     "Service activation"},
286   { PARAM_TYPE_USER_TELESERV_INFO,     "User teleservice information"},
287   { PARAM_TYPE_TRANSM_MEDIUM_USED,     "Transmission medium used"},
288   { PARAM_TYPE_CALL_DIV_INFO,          "Call diversion information"},
289   { PARAM_TYPE_ECHO_CTRL_INFO,         "Echo control information"},
290   { PARAM_TYPE_MSG_COMPAT_INFO,        "Message compatibility information"},
291   { PARAM_TYPE_PARAM_COMPAT_INFO,      "Parameter compatibility information"},
292   { PARAM_TYPE_MLPP_PRECEDENCE,        "MLPP precedence"},
293   { PARAM_TYPE_MCID_REQ_IND,           "MCID request indicators"},
294   { PARAM_TYPE_MCID_RSP_IND,           "MCID response indicators"},
295   { PARAM_TYPE_HOP_COUNTER,            "Hop counter"},
296   { PARAM_TYPE_TRANSM_MEDIUM_RQUR_PR,  "Transmission medium requirement prime"},
297   { PARAM_TYPE_LOCATION_NR,            "Location number"},
298   { PARAM_TYPE_REDIR_NR_RSTRCT,        "Redirection number restriction"},
299   { PARAM_TYPE_CALL_TRANS_REF,         "Call transfer reference"},
300   { PARAM_TYPE_LOOP_PREV_IND,          "Loop prevention indicators"},
301   { PARAM_TYPE_CALL_TRANS_NR,          "Call transfer number"},
302   { PARAM_TYPE_CCSS,                   "CCSS"},
303   { PARAM_TYPE_FORW_GVNS,              "Forward GVNS"},
304   { PARAM_TYPE_BACKW_GVNS,             "Backward GVNS"},
305   { PARAM_TYPE_REDIRECT_CAPAB,         "Redirect capability (reserved for national use)"},
306   { PARAM_TYPE_NETW_MGMT_CTRL,         "Network management controls"},
307   { PARAM_TYPE_CORRELATION_ID,         "Correlation id"},
308   { PARAM_TYPE_SCF_ID,                 "SCF id"},
309   { PARAM_TYPE_CALL_DIV_TREAT_IND,     "Call diversion treatment indicators"},
310   { PARAM_TYPE_CALLED_IN_NR,           "Called IN number"},
311   { PARAM_TYPE_CALL_OFF_TREAT_IND,     "Call offering treatment indicators"},
312   { PARAM_TYPE_CHARGED_PARTY_IDENT,    "Charged party identification (national use)"},
313   { PARAM_TYPE_CONF_TREAT_IND,         "Conference treatment indicators"},
314   { PARAM_TYPE_DISPLAY_INFO,           "Display information"},
315   { PARAM_TYPE_UID_ACTION_IND,         "UID action indicators"},
316   { PARAM_TYPE_UID_CAPAB_IND,          "UID capability indicators"},
317   { PARAM_TYPE_REDIRECT_COUNTER,       "Redirect counter (reserved for national use)"},
318   { PARAM_TYPE_COLLECT_CALL_REQ,       "Collect call request"},
319   { PARAM_TYPE_GENERIC_NR,             "Generic number"},
320   { PARAM_TYPE_GENERIC_DIGITS,         "Generic digits (national use)"},
321   { 0,                                 NULL}};
322
323
324 #define CIC_LENGTH                             2
325 #define MESSAGE_TYPE_LENGTH                    1
326 #define COMMON_HEADER_LENGTH                   (CIC_LENGTH + MESSAGE_TYPE_LENGTH)
327
328 #define MAXLENGTH                            0xFF /* since length field is 8 Bit long - used in number dissectors;
329                                                      max. number of address digits is 15 digits, but MAXLENGTH used 
330                                                      to avoid runtime errors */
331
332 #define PARAMETER_TYPE_LENGTH                  1
333 #define PARAMETER_POINTER_LENGTH               1
334 #define PARAMETER_LENGTH_IND_LENGTH            1
335
336 /* All following parameter length definitions are WITHOUT the parameter type byte and length indicator for optional parameters*/ 
337 #define PARAMETER_NAME_LENGTH                  1
338 #define PARAMETER_LENGTH_IND_LENGTH            1
339 #define ACCESS_DELIVERY_INFO_LENGTH            1
340 #define AUTO_CONGEST_LEVEL_LENGTH              1
341 #define BACKWARD_CALL_IND_LENGTH               2
342 #define BACKWARD_GVNS_LENGTH                   1
343 #define CALL_DIV_INFO_LENGTH                   1
344 #define CALL_DIV_TREATMENT_IND_LENGTH          1
345 #define CALL_HISTORY_INFO_LENGTH               2
346 #define CALL_OFFERING_TREATMENT_IND_LENGTH     1
347 #define CALL_REFERENCE_LENGTH                  5
348 #define CALL_TRANSFER_REF_LENGTH               1
349 #define CALLING_PRTYS_CATEGORY_LENGTH          1
350 #define CCSS_LENGTH                            1
351 #define CIRCUIT_ASSIGNMENT_MAP_LENGTH          5
352 #define CIRC_GRP_SV_MSG_TYPE_LENGTH            1
353 #define CLOSED_USR_GRP_INTERLOCK_CODE_LENGTH   4
354 #define COLLECT_CALL_REQUEST_LENGTH            1
355 #define CONFERENCE_TREATMENT_IND_LENGTH        1
356 #define CONNECTION_REQUEST_LENGTH              7
357 #define CONTINUITY_IND_LENGTH                  1
358 #define ECHO_CONTROL_INFO_LENGTH               1
359 #define END_OF_OPT_PART_LENGTH                 1
360 #define EVENT_INFO_LENGTH                      1
361 #define FACILITY_IND_LENGTH                    1
362 #define FORWARD_CALL_IND_LENGTH                2
363 #define GENERIC_NOTIFICATION_IND_LENGTH        1
364 #define HOP_COUNTER_LENGTH                     1
365 #define INFO_IND_LENGTH                        2
366 #define INFO_REQUEST_IND_LENGTH                2
367 #define LOOP_PREVENTION_IND_LENGTH             1
368 #define MCID_REQUEST_IND_LENGTH                1
369 #define MCID_RESPONSE_IND_LENGTH               1
370 #define MLPP_PRECEDENCE_LENGTH                 1
371 #define NATURE_OF_CONNECTION_IND_LENGTH        1
372 #define NETWORK_MANAGEMENT_CONTROLS_LENGTH     1
373 #define OPTIONAL_BACKWARD_CALL_IND_LENGTH      1
374 #define OPTIONAL_FORWARD_CALL_IND_LENGTH       1
375 #define ORIGINAL_ISC_POINT_CODE_LENGTH         2
376 #define PROPAGATION_DELAY_COUNT_LENGTH         2
377 #define REDIRECTION_NUMBER_LENGTH              2
378 #define REDIRECTION_INFO_LENGTH                2
379 #define REDIRECTION_NUMBER_RESTRICTION_LENGTH  1
380 #define SIGNALLING_POINT_CODE_LENGTH           2
381 #define SUSPEND_RESUME_IND_LENGTH              1
382 #define TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH 1
383 #define TRANSMISSION_MEDIUM_RQMT_PRIME_LENGTH  1
384 #define TRANSMISSION_MEDIUM_USED_LENGTH        1
385 #define UID_ACTION_IND_LENGTH                  1
386 #define UID_CAPABILITY_IND_LENGTH              1
387 #define USER_TELESERVICE_INFO_LENGTH           3
388 #define USER_TO_USER_IND_LENGTH                1
389 #define RANGE_LENGTH                           1
390
391 #define CALL_ID_LENGTH        3 /* for parameter Call Reference */
392 #define SPC_LENGTH            2 /* for parameter Call Reference, Connection request */
393 #define LOCAL_REF_LENGTH      3 /* for parameter Connection request */
394 #define PROTOCOL_CLASS_LENGTH 1 /* for parameter Connection request */
395 #define CREDIT_LENGTH         1 /* for parameter Connection request */
396
397 #define CIC_OFFSET            0
398
399 #define NO_SATELLITE_CIRCUIT_IN_CONNECTION   0
400 #define ONE_SATELLITE_CIRCUIT_IN_CONNECTION  1
401 #define TWO_SATELLITE_CIRCUIT_IN_CONNECTION  2
402 static const value_string isup_satellite_ind_value[] = {
403   { NO_SATELLITE_CIRCUIT_IN_CONNECTION,          "No Satellite circuit in connection"},
404   { ONE_SATELLITE_CIRCUIT_IN_CONNECTION,         "One Satellite circuit in connection"},  
405   { TWO_SATELLITE_CIRCUIT_IN_CONNECTION,         "Two Satellite circuits in connection"},
406   { 0,                                 NULL}};
407
408 #define CONTINUITY_CHECK_NOT_REQUIRED           0
409 #define CONTINUITY_CHECK_REQUIRED               1
410 #define CONTINUITY_CHECK_ON_A_PREVIOUS_CIRCUIT  2
411 static const value_string isup_continuity_check_ind_value[] = {
412   { CONTINUITY_CHECK_NOT_REQUIRED,               "Continuity check not required"},
413   { CONTINUITY_CHECK_REQUIRED,                   "Continuity check required on this circuit"},  
414   { CONTINUITY_CHECK_ON_A_PREVIOUS_CIRCUIT ,     "Continuity check performed on a previous circuit"},
415   { 0,                                 NULL}};
416
417 static const true_false_string isup_echo_control_device_ind_value = {
418   "Echo control device included",
419   "Echo control device not included"
420 };
421
422 static const true_false_string isup_natnl_inatnl_call_ind_value = {
423   "Call to be treated as international call",
424   "Call to be treated as national call"
425 };
426
427 #define NO_END_TO_END_METHOD_AVAILABLE       0
428 #define PASS_ALONG_METHOD_AVAILABLE          1
429 #define SCCP_METHOD_AVAILABLE                2
430 #define PASS_ALONG_AND_SCCP_METHOD_AVAILABLE 3
431 static const value_string isup_end_to_end_method_ind_value[] = {
432   { NO_END_TO_END_METHOD_AVAILABLE,          "No End-to-end method available (only link-by-link method available)"},
433   { PASS_ALONG_METHOD_AVAILABLE,             "Pass-along method available (national use)"},  
434   { SCCP_METHOD_AVAILABLE,                   "SCCP method available"},
435   { PASS_ALONG_AND_SCCP_METHOD_AVAILABLE,    "pass-along and SCCP method available (national use)"},
436   { 0,                                 NULL}};
437
438 static const true_false_string isup_interworking_ind_value = {
439   "interworking encountered",
440   "no interworking encountered (No.7 signalling all the way)"
441 };
442
443 static const true_false_string isup_end_to_end_info_ind_value = {
444   "end-to-end information available",
445   "no end-to-end information available"
446 };
447
448 static const true_false_string isup_ISDN_user_part_ind_value = {
449   "ISDN user part used all the way",
450   "ISDN user part not used all the way"
451 };
452
453 #define ISUP_PREFERED_ALL_THE_WAY               0
454 #define ISUP_NOT_REQUIRED_ALL_THE_WAY           1
455 #define ISUP_REQUIRED_ALL_WAY                   2
456 #define ISUP_ISDN_USER_PART_IND_SPARE           3
457 static const value_string isup_preferences_ind_value[] = {
458   { ISUP_PREFERED_ALL_THE_WAY,                   "ISDN user part prefered all the way"},
459   { ISUP_NOT_REQUIRED_ALL_THE_WAY,               "ISDN user part not required all the way"},  
460   { ISUP_REQUIRED_ALL_WAY,                       "ISDN user part required all the way"},
461   { ISUP_ISDN_USER_PART_IND_SPARE,               "spare"},
462   { 0,                                 NULL}};
463
464 static const true_false_string isup_ISDN_originating_access_ind_value = {
465   "originating access ISDN",
466   "originating access non-ISDN"
467 };
468
469 #define NO_INDICATION                                0
470 #define CONNECTIONLESS_METHOD_AVAILABLE              1
471 #define CONNECITON_ORIENTED_METHOD_AVAILABLE         2
472 #define CONNECTIONLESS_AND_ORIENTED_METHOD_AVAILABLE 3
473 static const value_string isup_SCCP_method_ind_value[] = {
474   { NO_INDICATION,                                  "No indication"},
475   { CONNECTIONLESS_METHOD_AVAILABLE,                "Connectionless method available (national use)"},  
476   { CONNECITON_ORIENTED_METHOD_AVAILABLE,           "Connection oriented method available"},
477   { CONNECTIONLESS_AND_ORIENTED_METHOD_AVAILABLE,   "Connectionless and -oriented method available (national use)"},
478   { 0,                                 NULL}};
479
480 #define UNKNOWN_AT_THIS_TIME                 0
481 #define OPERATOR_FRENCH                      1
482 #define OPERATOR_ENGLISH                     2
483 #define OPERATOR_GERMAN                      3
484 #define OPERATOR_RUSSIAN                     4
485 #define OPERATOR_SPANISH                     5
486 #define ORDINARY_CALLING_SUBSCRIBER         10
487 #define CALLING_SUBSCRIBER_WITH_PRIORITY    11
488 #define DATA_CALL                           12
489 #define TEST_CALL                           13
490 #define PAYPHONE                            15
491 static const value_string isup_calling_partys_category_value[] = {
492   { UNKNOWN_AT_THIS_TIME,               "Category unknown at this time (national use)"},
493   { OPERATOR_FRENCH,                    "operator, language French"},  
494   { OPERATOR_ENGLISH,                   "operator, language English"},  
495   { OPERATOR_GERMAN,                    "operator, language German"},  
496   { OPERATOR_RUSSIAN,                   "operator, language Russian"},  
497   { OPERATOR_SPANISH,                   "operator, language Spanish"},  
498   { ORDINARY_CALLING_SUBSCRIBER,        "ordinary calling subscriber"},
499   { CALLING_SUBSCRIBER_WITH_PRIORITY,   "calling subscriber with priority"},
500   { DATA_CALL,                          "data call (voice band data)"},
501   { TEST_CALL,                          "test call"},
502   { PAYPHONE,                           "payphone"},
503   { 0,                                 NULL}};
504
505 #define MEDIUM_SPEECH                        0
506 #define MEDIUM_64KBS                         2
507 #define MEDIUM_3_1_KHZ_AUDIO                 3
508 #define MEDIUM_RESERVED_SERVICE2_1           4
509 #define MEDIUM_RESERVED_SERVICE1_2           5
510 #define MEDIUM_64KBS_PREFERED                6
511 #define MEDIUM_2_64KBS                       7
512 #define MEDIUM_384KBS                        8
513 #define MEDIUM_1536KBS                       9
514 #define MEDIUM_1920KBS                      10
515 #define MEDIUM_3_64KBS                      16
516 #define MEDIUM_4_64KBS                      17
517 #define MEDIUM_5_64KBS                      18
518 #define MEDIUM_7_64KBS                      20
519 #define MEDIUM_8_64KBS                      21
520 #define MEDIUM_9_64KBS                      22
521 #define MEDIUM_10_64KBS                     23
522 #define MEDIUM_11_64KBS                     24
523 #define MEDIUM_12_64KBS                     25
524 #define MEDIUM_13_64KBS                     26
525 #define MEDIUM_14_64KBS                     27
526 #define MEDIUM_15_64KBS                     28
527 #define MEDIUM_16_64KBS                     29
528 #define MEDIUM_17_64KBS                     30
529 #define MEDIUM_18_64KBS                     31
530 #define MEDIUM_19_64KBS                     32
531 #define MEDIUM_20_64KBS                     33
532 #define MEDIUM_21_64KBS                     34
533 #define MEDIUM_22_64KBS                     35
534 #define MEDIUM_23_64KBS                     36
535 #define MEDIUM_25_64KBS                     38
536 #define MEDIUM_26_64KBS                     39
537 #define MEDIUM_27_64KBS                     40
538 #define MEDIUM_28_64KBS                     41
539 #define MEDIUM_29_64KBS                     42
540 static const value_string isup_transmission_medium_requirement_value[] = {
541   { MEDIUM_SPEECH,                       "speech"},
542   { MEDIUM_64KBS,                        "64 kbit/s unrestricted"},
543   { MEDIUM_3_1_KHZ_AUDIO,                "3.1 kHz audio"},
544   { MEDIUM_RESERVED_SERVICE2_1,          "reserved for alternate speech (service 2)/64 kbit/s unrestricted (service 1)"},
545   { MEDIUM_RESERVED_SERVICE1_2,          "reserved for alternate 64 kbit/s unrestricted (service 1)/speech (service 2)"},
546   { MEDIUM_64KBS_PREFERED,               "64 kbit/s prefered"},
547   { MEDIUM_2_64KBS,                      "2x64 kbit/s unrestricted"},
548   { MEDIUM_384KBS,                       "384 kbit/s unrestricted"},
549   { MEDIUM_1536KBS,                      "1536 kbit/s unrestricted"},
550   { MEDIUM_1920KBS,                      "1920 kbit/s unrestricted"},
551   { MEDIUM_3_64KBS,                      "3x64 kbit/s unrestricted"},
552   { MEDIUM_4_64KBS,                      "4x64 kbit/s unrestricted"},
553   { MEDIUM_5_64KBS,                      "5x64 kbit/s unrestricted"},
554   { MEDIUM_7_64KBS,                      "7x64 kbit/s unrestricted"},
555   { MEDIUM_8_64KBS,                      "8x64 kbit/s unrestricted"},
556   { MEDIUM_9_64KBS,                      "9x64 kbit/s unrestricted"},
557   { MEDIUM_10_64KBS,                     "10x64 kbit/s unrestricted"},
558   { MEDIUM_11_64KBS,                     "11x64 kbit/s unrestricted"},
559   { MEDIUM_12_64KBS,                     "12x64 kbit/s unrestricted"},
560   { MEDIUM_13_64KBS,                     "13x64 kbit/s unrestricted"},
561   { MEDIUM_14_64KBS,                     "14x64 kbit/s unrestricted"},
562   { MEDIUM_15_64KBS,                     "15x64 kbit/s unrestricted"},
563   { MEDIUM_16_64KBS,                     "16x64 kbit/s unrestricted"},
564   { MEDIUM_17_64KBS,                     "17x64 kbit/s unrestricted"},
565   { MEDIUM_18_64KBS,                     "18x64 kbit/s unrestricted"},
566   { MEDIUM_19_64KBS,                     "19x64 kbit/s unrestricted"},
567   { MEDIUM_20_64KBS,                     "20x64 kbit/s unrestricted"},
568   { MEDIUM_21_64KBS,                     "21x64 kbit/s unrestricted"},
569   { MEDIUM_22_64KBS,                     "22x64 kbit/s unrestricted"},
570   { MEDIUM_23_64KBS,                     "23x64 kbit/s unrestricted"},
571   { MEDIUM_25_64KBS,                     "25x64 kbit/s unrestricted"},
572   { MEDIUM_26_64KBS,                     "26x64 kbit/s unrestricted"},
573   { MEDIUM_27_64KBS,                     "27x64 kbit/s unrestricted"},
574   { MEDIUM_28_64KBS,                     "28x64 kbit/s unrestricted"},
575   { MEDIUM_29_64KBS,                     "29x64 kbit/s unrestricted"},
576   { 0,                                 NULL}};
577 static const value_string isup_transmission_medium_requirement_prime_value[] = {
578   { MEDIUM_SPEECH,                       "speech"},
579   { MEDIUM_64KBS,                        "reserved for 64 kbit/s unrestricted"},
580   { MEDIUM_3_1_KHZ_AUDIO,                "3.1 kHz audio"},
581   { MEDIUM_RESERVED_SERVICE2_1,          "reserved for alternate speech (service 2)/64 kbit/s unrestricted (service 1)"},
582   { MEDIUM_RESERVED_SERVICE1_2,          "reserved for alternate 64 kbit/s unrestricted (service 1)/speech (service 2)"},
583   { MEDIUM_64KBS_PREFERED,               "reserved for 64 kbit/s prefered"},
584   { MEDIUM_2_64KBS,                      "reserved for 2x64 kbit/s unrestricted"},
585   { MEDIUM_384KBS,                       "reserved for 384 kbit/s unrestricted"},
586   { MEDIUM_1536KBS,                      "reserved for 1536 kbit/s unrestricted"},
587   { MEDIUM_1920KBS,                      "reserved for 1920 kbit/s unrestricted"},
588   { 0,                                 NULL}};
589
590
591 /* Definitions for Called and Calling Party number */
592 #define ISUP_ODD_EVEN_MASK                       0x80
593 #define ISUP_NATURE_OF_ADDRESS_IND_MASK          0x7F
594 #define ISUP_INN_MASK                            0x80
595 #define ISUP_NI_MASK                             0x80
596 #define ISUP_NUMBERING_PLAN_IND_MASK             0x70
597 #define ISUP_ADDRESS_PRESENTATION_RESTR_IND_MASK 0x0C
598 #define ISUP_SCREENING_IND_MASK                  0x03
599 #define ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK       0x0F
600 #define ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK      0xF0
601
602 static const true_false_string isup_odd_even_ind_value = {
603   "odd number of address signals",
604   "even number of address signals"
605 };
606
607 #define ISUP_CALLED_PARTY_NATURE_SUBSCRIBER_NR  1
608 #define ISUP_CALLED_PARTY_NATURE_UNKNOWN        2
609 #define ISUP_CALLED_PARTY_NATURE_NATIONAL_NR    3
610 #define ISUP_CALLED_PARTY_NATURE_INTERNATNL_NR  4
611 #define ISUP_CALLED_PARTY_NATURE_NETW_SPEC_NR   5
612 static const value_string isup_called_party_nature_of_address_ind_value[] = {
613   { ISUP_CALLED_PARTY_NATURE_SUBSCRIBER_NR,     "subscriber number (national use)"},
614   { ISUP_CALLED_PARTY_NATURE_UNKNOWN,           "unknown (national use)"},  
615   { ISUP_CALLED_PARTY_NATURE_NATIONAL_NR,       "national (significant) number"},
616   { ISUP_CALLED_PARTY_NATURE_INTERNATNL_NR,     "international number"},
617   { ISUP_CALLED_PARTY_NATURE_NETW_SPEC_NR,      "network-specific number (national use)"},
618   { 0,                                 NULL}};
619
620 static const value_string isup_calling_party_nature_of_address_ind_value[] = {
621   { ISUP_CALLED_PARTY_NATURE_SUBSCRIBER_NR,     "subscriber number (national use)"},
622   { ISUP_CALLED_PARTY_NATURE_UNKNOWN,           "unknown (national use)"},  
623   { ISUP_CALLED_PARTY_NATURE_NATIONAL_NR,       "national (significant) number"},
624   { ISUP_CALLED_PARTY_NATURE_INTERNATNL_NR,     "international number"},
625   { 0,                                 NULL}};
626
627 static const true_false_string isup_INN_ind_value = {
628   "routing to internal network number not allowed",
629   "routing to internal network number allowed "
630 };
631 static const true_false_string isup_NI_ind_value = {
632   "incomplete",
633   "complete"
634 };
635
636 #define ISDN_NUMBERING_PLAN                     1
637 #define DATA_NUMBERING_PLAN                     3
638 #define TELEX_NUMBERING_PLAN                    4
639 static const value_string isup_numbering_plan_ind_value[] = {
640   { ISDN_NUMBERING_PLAN,     "ISDN (Telephony) numbering plan"},
641   { DATA_NUMBERING_PLAN,     "Data numbering plan (national use)"},
642   { TELEX_NUMBERING_PLAN,    "Telex numbering plan (national use)"},
643   { 5,                       "Reserved for national use"},
644   { 6,                       "Reserved for national use"},
645   { 0,                                 NULL}};
646
647 #define ADDRESS_PRESETATION_ALLOWED      0
648 #define ADDRESS_PRESETATION_RESTRICTED   1
649 #define ADDRESS_NOT_AVAILABLE            2
650 static const value_string isup_address_presentation_restricted_ind_value[] = {
651   { ADDRESS_PRESETATION_ALLOWED,     "presentation allowed"},
652   { ADDRESS_PRESETATION_RESTRICTED,  "presentation restricted"},
653   { ADDRESS_NOT_AVAILABLE,           "address not availabe (national use)"},
654   { 3,                                 "spare"},
655   { 0,                                 NULL}};
656
657 static const value_string isup_screening_ind_value[] = {
658   { 0,     "reserved"},
659   { 1,     "user provided, verified and passed"},
660   { 2,     "reserved"},
661   { 3,     "network provided"},
662   { 0,     NULL}};
663
664 static const value_string isup_screening_ind_enhanced_value[] = {
665   { 0,     "user provided, not verified"},
666   { 1,     "user provided, verified and passed"},
667   { 2,     "user provided, verified and failed"},
668   { 3,     "network provided"},
669   { 0,     NULL}};
670
671 static const value_string isup_called_party_address_digit_value[] = {
672   { 0,  "0"},
673   { 1,  "1"},
674   { 2,  "2"},
675   { 3,  "3"},
676   { 4,  "4"},
677   { 5,  "5"},
678   { 6,  "6"},
679   { 7,  "7"},
680   { 8,  "8"},
681   { 9,  "9"},
682   { 10, "spare"},
683   { 11, "code 11 "},
684   { 12, "code 12"},
685   { 15, "Stop sending"},
686   { 0,  NULL}};
687
688 static const value_string isup_calling_party_address_digit_value[] = {
689   { 0,  "0"},
690   { 1,  "1"},
691   { 2,  "2"},
692   { 3,  "3"},
693   { 4,  "4"},
694   { 5,  "5"},
695   { 6,  "6"},
696   { 7,  "7"},
697   { 8,  "8"},
698   { 9,  "9"},
699   { 10, "spare"},
700   { 11, "code 11 "},
701   { 12, "code 12"},
702   { 15, "spare"},
703   { 0,  NULL}};
704
705 /*End of Called/Calling party address definitions */
706
707
708 static const true_false_string isup_calling_party_address_request_ind_value = {
709   "calling party address requested",
710   "calling party address not requested"
711 };
712 static const true_false_string isup_holding_ind_value = {
713   "holding requested",
714   "holding not requested"
715 };
716 static const true_false_string isup_calling_partys_category_request_ind_value = {
717   "Calling Party's category requested",
718   "Calling Party's category not requested",
719 };
720 static const true_false_string isup_charge_information_request_ind_value = {
721   "Charge Information requested",
722   "Charge Information not requested"
723 };
724 static const true_false_string isup_malicious_call_identification_request_ind_value = {
725   "Malicious call identification requested",
726   "Malicious call identification not requested"
727 };
728
729 #define CALLING_PARTY_ADDRESS_NOT_INCLUDED             0
730 #define CALLING_PARTY_ADDRESS_NOT_AVAILABLE            1
731 #define CALLING_PARTY_ADDRESS_INCLUDED                 3
732 static const value_string isup_calling_party_address_response_ind_value[] = {
733   { CALLING_PARTY_ADDRESS_NOT_INCLUDED, "Calling party address not included"},
734   { CALLING_PARTY_ADDRESS_NOT_AVAILABLE,"Calling party address not available"},
735   { 4,                                  "spare"},
736   { CALLING_PARTY_ADDRESS_INCLUDED,     "Calling party address included"},
737   { 0,                                 NULL}};
738
739 static const true_false_string isup_hold_provided_ind_value = {
740   "hold provided",
741   "hold not provided"
742 };
743 static const true_false_string isup_calling_partys_category_response_ind_value = {
744   "Calling Party's category included",
745   "Calling Party's category not included",
746 };
747 static const true_false_string isup_charge_information_response_ind_value = {
748   "Charge Information included",
749   "Charge Information not included"
750 };
751 static const true_false_string isup_solicited_information_ind_value = {
752   "unsolicited",
753   "solicited"
754 };
755
756 static const true_false_string isup_continuity_ind_value = {
757   "Continuity check successful",
758   "Continuity ckec failed"
759 };
760
761 #define CHARGE_NO_IND       0
762 #define CHARGE_NO_CHARGE    1
763 #define CHARGE_CHARGE       2
764 static const value_string isup_charge_ind_value[] = {
765   { CHARGE_NO_IND,    "No indication"},
766   { CHARGE_NO_CHARGE, "No charge"},
767   { CHARGE_CHARGE,    "Charge"},
768   { 3,                "spare"},
769   { 0,                NULL}};
770
771 #define CALLED_PARTYS_STATUS_NO_IND            0
772 #define CALLED_PARTYS_STATUS_SUBSCR_FREE       1
773 #define CALLED_PARTYS_STATUS_CONNECT_WHEN_FREE 2      
774 static const value_string isup_called_partys_status_ind_value[] = {
775   { CALLED_PARTYS_STATUS_NO_IND,            "No indication"},
776   { CALLED_PARTYS_STATUS_SUBSCR_FREE,       "Subscriber free"},
777   { CALLED_PARTYS_STATUS_CONNECT_WHEN_FREE, "Connect when free (national use)"},
778   { 3,                                      "spare"},
779   { 0,                NULL}};
780
781 #define CALLED_PARTYS_CATEGORY_NO_IND            0
782 #define CALLED_PARTYS_CATEGORY_ORDINARY_SUBSCR   1
783 #define CALLED_PARTYS_CATEGORY_PAYPHONE          2      
784 static const value_string isup_called_partys_category_ind_value[] = {
785   { CALLED_PARTYS_CATEGORY_NO_IND,             "No indication"},
786   { CALLED_PARTYS_CATEGORY_ORDINARY_SUBSCR,    "Ordinary subscriber"},
787   { CALLED_PARTYS_CATEGORY_PAYPHONE,           "Payphone"},
788   { 3,                                         "spare"},
789   { 0,                NULL}};
790
791 static const true_false_string isup_ISDN_terminating_access_ind_value = {
792   "terminating access ISDN",
793   "terminating access non-ISDN"
794 };
795
796 static const true_false_string isup_suspend_resume_ind_value = {
797   "network initiated",
798   "ISDN subscriber initiated"
799 };
800 #define MAINTENANCE            0
801 #define HARDWARE_FAILURE       1
802 #define RES_FOR_NATNL_USE      2      
803 static const value_string isup_cgs_message_type_value[] = {
804   { MAINTENANCE,            "maintenance oriented"},
805   { HARDWARE_FAILURE,       "hardware failure oriented"},
806   { RES_FOR_NATNL_USE,      "reserved for national use (ISUP'84)"},
807   { 3,                      "spare"},
808   { 0,                NULL}};
809
810 #define USER_TO_USER_SERVICE      2      
811 static const value_string isup_facility_ind_value[] = {
812   { USER_TO_USER_SERVICE,     "user-to-user service"},
813   { 0,                NULL}};
814
815 #define MTC_BLCK_STATE_TRANSIENT  0
816 #define MTC_BLCK_STATE_UNEQUIPPED 3
817 static const value_string isup_mtc_blocking_state_DC00_value[] = {
818   {  MTC_BLCK_STATE_TRANSIENT,  "transient"},
819   { 1,                          "spare"},
820   { 2,                          "spare"},
821   {  MTC_BLCK_STATE_UNEQUIPPED, "unequipped"},
822   { 0,                NULL}};
823
824 #define MTC_BLCK_NO_BLOCKING      0
825 #define MTC_LOCALLY_BLOCKED       1
826 #define MTC_REMOTELY_BLOCKED      2
827 #define MTC_LOCAL_REMOTE_BLOCKED  3
828 static const value_string isup_mtc_blocking_state_DCnot00_value[] = {
829   {  MTC_BLCK_NO_BLOCKING,     "no blocking (active)"},
830   {  MTC_LOCALLY_BLOCKED,      "locally blocked"},
831   {  MTC_REMOTELY_BLOCKED,     "remotely blocked"},
832   {  MTC_LOCAL_REMOTE_BLOCKED, "locally and remotely blocked"},
833   {  0,                NULL}};
834
835 #define CALL_PROC_INCOMING_BUSY 1
836 #define CALL_PROC_OUTGOING_BUSY 2
837 #define CALL_PROC_IDLE          3
838 static const value_string isup_call_processing_state_value[] = {
839   {  CALL_PROC_INCOMING_BUSY,     "circuit incoming busy"},
840   {  CALL_PROC_OUTGOING_BUSY,     "circuit outgoing busy"},
841   {  CALL_PROC_IDLE,              "idle"},
842   {  0,                NULL}};
843
844 #define HW_BLCK_NO_BLOCKING          0
845 #define HW_LOCALLY_BLOCKED           1
846 #define HW_REMOTELY_BLOCKED          2
847 #define HW_LOCAL_REMOTE_BLOCKED      3
848 static const value_string isup_HW_blocking_state_value[] = {
849   {  HW_BLCK_NO_BLOCKING,     "no blocking (active)"},
850   {  HW_LOCALLY_BLOCKED,      "locally blocked"},
851   {  HW_REMOTELY_BLOCKED,     "remotely blocked"},
852   {  HW_LOCAL_REMOTE_BLOCKED, "locally and remotely blocked"},
853   {  0,                NULL}};
854
855 #define EVENT_ALERTING      1
856 #define EVENT_PROGRESS      2
857 #define EVENT_INBAND_INFO   3
858 #define EVENT_ON_BUSY       4
859 #define EVENT_ON_NO_REPLY   5
860 #define EVENT_UNCONDITIONAL 6
861 static const value_string isup_event_ind_value[] = {
862   /* according 3.21/Q.763 */
863   {  EVENT_ALERTING,     "ALERTING"},
864   {  EVENT_PROGRESS,     "PROGRESS"},
865   {  EVENT_INBAND_INFO,  "in-band information or an appropriate pattern is now available"},
866   {  EVENT_ON_BUSY,      "call forwarded on busy (national use)"},
867   {  EVENT_ON_NO_REPLY,  "call forwarded on no reply (national use)"},
868   {  EVENT_UNCONDITIONAL,"call forwarded unconditional (national use)"},
869   {  0,                NULL}};
870
871 static const true_false_string isup_event_presentation_restricted_ind_value = {
872   /* according 3.21/Q.763 */
873   "presentation restricted",
874   "no indication"
875 };
876 #define CUG_NON_CUG_CALL                      0
877 #define CUG_CALL_OUTGOING_ACCESS_ALLOWED      2
878 #define CUG_CALL_OUTGOING_ACCESS_NOT_ALLOWED  3
879 static const value_string isup_CUG_call_ind_value[] = {
880   /* according 3.38/Q.763 */
881   {  CUG_NON_CUG_CALL,                     "non-CUG call"},
882   {  1,                                    "spare"},
883   {  CUG_CALL_OUTGOING_ACCESS_ALLOWED,     "closed user group call, outgoing access allowed"},
884   {  CUG_CALL_OUTGOING_ACCESS_NOT_ALLOWED, "closed user group call, outgoing access not allowed"},
885   {  0,                NULL}};
886
887
888 static const true_false_string isup_simple_segmentation_ind_value = {
889   /* according 3.38/Q.763 */
890   "additional information will be sent in a segmentation message",
891   "no additional information will be sent"
892 };
893
894 static const true_false_string isup_connected_line_identity_request_ind_value = {
895   /* according 3.38/Q.763 */
896   "requested",
897   "not requested"
898 };
899
900 static const value_string isup_redirecting_ind_value[] = {
901   /* according 3.45/Q.763 */
902   {  0,        "no redirection (national use)"},
903   {  1,        "call rerouted (national use)"},
904   {  2,        "call rerouted, all redirection information presentation restricted (national use)"},
905   {  3,        "call diverted"},
906   {  4,        "call diverted, all redirection information presentation restricted"},
907   {  5,        "call rerouted, redirection number presentation restricted (national use)"},
908   {  6,        "call diversion, redirection number presentation restricted (national use)"},
909   {  7,        "spare"},
910   {  0,         NULL}};
911
912 static const value_string isup_original_redirection_reason_value[] = {
913   /* according 3.45/Q.763 */
914   {  0,        "unknown/not available"},
915   {  1,        "user busy (national use)"},
916   {  2,        "no reply (national use)"},
917   {  3,        "unconditional (national use)"},
918   {  0,         NULL}};
919
920 static const value_string isup_redirection_reason_value[] = {
921   /* according 3.45/Q.763 */
922   {  0,        "unknown/not available"},
923   {  1,        "user busy (national use)"},
924   {  2,        "no reply (national use)"},
925   {  3,        "unconditional (national use)"},
926   {  4,        "deflection during alerting"},
927   {  5,        "deflection immediate response"},
928   {  6,        "mobile subscriber not reachable"},
929   {  0,         NULL}};
930
931 static const value_string isup_type_of_network_identification_value[] = {
932   /* according 3.53/Q.763 */
933   {  0,        "CCITT/ITU-T-standardized identification"},
934   {  2,        "national network identification"},
935   {  0,         NULL}};
936
937 static const value_string isup_network_identification_plan_value[] = {
938   /* according 3.53/Q.763 */
939   {  0,        "if CCITT/ITU-T id - unknown"},
940   {  3,        "if CCITT/ITU-T id - public data network id code (X.121)"},
941   {  6,        "if CCITT/ITU-T id - public land Mobile Network id code (E.211)"},
942   {  0,         NULL}};
943
944 static const value_string isup_map_type_value[] = {
945   /* according 3.69/Q.763 */
946   {  1,        "1544 kbit/s digital path map format (64 kbit/s base rate"},
947   {  2,        "2048 kbit/s digital path map format (64 kbit/s base rate"},
948   {  0,         NULL}};
949
950 static const value_string isup_auto_congestion_level_value[] = {
951   /* according 3.4/Q.763 */
952   {  1,        "Congestion level 1 exceeded"},
953   {  2,        "Congestion level 2 exceeded"},
954   {  0,         NULL}};
955
956 static const true_false_string isup_inband_information_ind_value = {
957   /* according 3.37/Q.763 */
958   "in-band information or an appropirate pattern is now available",
959   "no indication"
960 };
961 static const true_false_string isup_call_diversion_may_occur_ind_value = {
962   /* according 3.37/Q.763 */
963   "call diversion may occur",
964   "no indication"
965 };
966 static const true_false_string isup_MLPP_user_ind_value = {
967   /* according 3.37/Q.763 */
968   "MLPP user",
969   "no indication"
970 };
971
972 static const true_false_string isup_access_delivery_ind_value = {
973   /* according 3.2/Q.763 */
974   "No set-up message generated",
975   "Set-up message generated"
976 };
977
978 static const value_string isup_loop_prevention_response_ind_value[] = {
979   /* according 3.67/Q.763 */
980   {  0,        "insufficient information"},
981   {  1,        "no loop exists"},
982   {  2,        "simultaneous transfer"},
983   {  0,         NULL}};
984
985 static const true_false_string isup_temporary_alternative_routing_ind_value = {
986   /* according 3.68/Q.763 */
987   "TAR controlled call",
988   "no indication"
989 };
990 static const true_false_string isup_extension_ind_value = {
991   /* according 3.68/Q.763 */
992   "last octet",
993   "information continues through the next octet"
994 };
995
996 static const value_string isup_call_to_be_diverted_ind_value[] = {
997   /* according 3.72/Q.763 */
998   {  0,        "no indication"},
999   {  1,        "call diversion allowed"},
1000   {  2,        "call diversion not allowed"},
1001   {  3,        "spare"},
1002   {  0,         NULL}};
1003
1004 static const value_string isup_call_to_be_offered_ind_value[] = {
1005   /* according 3.72/Q.763 */
1006   {  0,        "no indication"},
1007   {  1,        "call offering not allowed"},
1008   {  2,        "call offering allowed"},
1009   {  3,        "spare"},
1010   {  0,         NULL}};
1011
1012 static const value_string isup_conference_acceptance_ind_value[] = {
1013   /* according 3.76/Q.763 */
1014   {  0,        "no indication"},
1015   {  1,        "accept conference request"},
1016   {  2,        "reject conference request"},
1017   {  3,        "spare"},
1018   {  0,         NULL}};
1019
1020
1021 /* Generalized bit masks for 8 and 16 bits fields */
1022 #define A_8BIT_MASK  0x01
1023 #define B_8BIT_MASK  0x02
1024 #define C_8BIT_MASK  0x04
1025 #define D_8BIT_MASK  0x08
1026 #define E_8BIT_MASK  0x10
1027 #define F_8BIT_MASK  0x20
1028 #define G_8BIT_MASK  0x40
1029 #define H_8BIT_MASK  0x80
1030
1031 #define BA_8BIT_MASK 0x03
1032 #define CB_8BIT_MASK 0x06
1033 #define DC_8BIT_MASK 0x0C
1034 #define FE_8BIT_MASK 0x30
1035 #define GFE_8BIT_MASK 0x70
1036 #define DCBA_8BIT_MASK 0x0F
1037 #define EDCBA_8BIT_MASK 0x1F
1038 #define HGFE_8BIT_MASK 0xF0
1039 #define GFEDCBA_8BIT_MASK 0x7F
1040 #define FEDCBA_8BIT_MASK 0x3F
1041
1042 #define A_16BIT_MASK  0x0100
1043 #define B_16BIT_MASK  0x0200
1044 #define C_16BIT_MASK  0x0400
1045 #define D_16BIT_MASK  0x0800
1046 #define E_16BIT_MASK  0x1000
1047 #define F_16BIT_MASK  0x2000
1048 #define G_16BIT_MASK  0x4000
1049 #define H_16BIT_MASK  0x8000
1050 #define I_16BIT_MASK  0x0001
1051 #define J_16BIT_MASK  0x0002
1052 #define K_16BIT_MASK  0x0004
1053 #define L_16BIT_MASK  0x0008
1054 #define M_16BIT_MASK  0x0010
1055 #define N_16BIT_MASK  0x0020
1056 #define O_16BIT_MASK  0x0040
1057 #define P_16BIT_MASK  0x0080
1058
1059 #define BA_16BIT_MASK 0x0300 
1060 #define CB_16BIT_MASK 0x0600
1061 #define DC_16BIT_MASK 0x0C00
1062 #define FE_16BIT_MASK 0x3000
1063 #define HG_16BIT_MASK 0xC000
1064 #define KJ_16BIT_MASK 0x0006
1065 #define PO_16BIT_MASK 0x00C0
1066
1067 #define CBA_16BIT_MASK 0x0700
1068 #define KJI_16BIT_MASK 0x0007
1069 #define HGFE_16BIT_MASK 0xF000
1070 #define PONM_16BIT_MASK 0x00F0
1071
1072 /* Initialize the protocol and registered fields */
1073 static int proto_isup = -1;
1074 static int hf_isup_cic = -1;
1075 static int hf_isup_message_type = -1;
1076 static int hf_isup_parameter_type = -1;
1077 static int hf_isup_parameter_length = -1;
1078 static int hf_isup_mandatory_variable_parameter_pointer = -1;
1079 static int hf_isup_pointer_to_start_of_optional_part = -1;
1080
1081 static int hf_isup_satellite_indicator = -1;
1082 static int hf_isup_continuity_check_indicator = -1;
1083 static int hf_isup_echo_control_device_indicator = -1;
1084
1085 static int hf_isup_forw_call_natnl_inatnl_call_indicator = -1;
1086 static int hf_isup_forw_call_end_to_end_method_indicator = -1;
1087 static int hf_isup_forw_call_interworking_indicator = -1;
1088 static int hf_isup_forw_call_end_to_end_info_indicator = -1;
1089 static int hf_isup_forw_call_isdn_user_part_indicator = -1;
1090 static int hf_isup_forw_call_preferences_indicator = -1;
1091 static int hf_isup_forw_call_isdn_access_indicator = -1;
1092 static int hf_isup_forw_call_sccp_method_indicator = -1;
1093
1094 static int hf_isup_calling_partys_category = -1;
1095
1096 static int hf_isup_transmission_medium_requirement = -1;
1097
1098 static int hf_isup_odd_even_indicator = -1;
1099 static int hf_isup_called_party_nature_of_address_indicator = -1;
1100 static int hf_isup_calling_party_nature_of_address_indicator = -1;
1101 static int hf_isup_inn_indicator = -1;
1102 static int hf_isup_ni_indicator = -1;
1103 static int hf_isup_numbering_plan_indicator = -1;
1104 static int hf_isup_address_presentation_restricted_indicator = -1;
1105 static int hf_isup_screening_indicator = -1;
1106 static int hf_isup_screening_indicator_enhanced = -1;
1107 static int hf_isup_called_party_odd_address_signal_digit = -1;
1108 static int hf_isup_calling_party_odd_address_signal_digit = -1;
1109 static int hf_isup_called_party_even_address_signal_digit = -1;
1110 static int hf_isup_calling_party_even_address_signal_digit = -1;
1111
1112 static int hf_isup_calling_party_address_request_indicator = -1;
1113 static int hf_isup_info_req_holding_indicator = -1;
1114 static int hf_isup_calling_partys_category_request_indicator = -1;
1115 static int hf_isup_charge_information_request_indicator = -1;
1116 static int hf_isup_malicious_call_identification_request_indicator = -1;
1117
1118 static int hf_isup_calling_party_address_response_indicator = -1;
1119 static int hf_isup_hold_provided_indicator = -1;
1120 static int hf_isup_calling_partys_category_response_indicator = -1;
1121 static int hf_isup_charge_information_response_indicator = -1;
1122 static int hf_isup_solicited_indicator = -1;
1123
1124 static int hf_isup_continuity_indicator = -1;
1125
1126 static int hf_isup_backw_call_charge_ind = -1 ; 
1127 static int hf_isup_backw_call_called_partys_status_ind = -1;
1128 static int hf_isup_backw_call_called_partys_category_ind = -1;
1129 static int hf_isup_backw_call_end_to_end_method_ind = -1;
1130 static int hf_isup_backw_call_interworking_ind = -1;
1131 static int hf_isup_backw_call_end_to_end_info_ind = -1;
1132 static int hf_isup_backw_call_isdn_user_part_ind = -1;
1133 static int hf_isup_backw_call_holding_ind = -1;
1134 static int hf_isup_backw_call_isdn_access_ind = -1;
1135 static int hf_isup_backw_call_echo_control_device_ind = -1;
1136 static int hf_isup_backw_call_sccp_method_ind = -1;
1137  
1138 static int hf_isup_suspend_resume_indicator = -1;
1139
1140 static int hf_isup_range_indicator = -1;
1141 static int hf_isup_cgs_message_type = -1;
1142
1143 static int hf_isup_mtc_blocking_state1 = -1;
1144 static int hf_isup_mtc_blocking_state2 = -1;
1145 static int hf_isup_call_proc_state = -1;
1146 static int hf_isup_hw_blocking_state = -1;
1147
1148 static int hf_isup_event_ind = -1;
1149 static int hf_isup_event_presentation_restricted_ind = -1;
1150
1151 static int hf_isup_cug_call_ind = -1;
1152 static int hf_isup_simple_segmentation_ind = -1;
1153 static int hf_isup_connected_line_identity_request_ind = -1;
1154
1155 static int hf_isup_redirecting_ind = -1;
1156 static int hf_isup_original_redirection_reason = -1;
1157 static int hf_isup_redirection_counter = -1;
1158 static int hf_isup_redirection_reason = -1;
1159
1160 static int hf_isup_type_of_network_identification = -1;
1161 static int hf_isup_network_identification_plan = -1;
1162
1163 static int hf_isup_map_type = -1;
1164
1165 static int hf_isup_automatic_congestion_level = -1;
1166
1167 static int hf_isup_inband_information_ind = -1;
1168 static int hf_isup_call_diversion_may_occur_ind = -1;
1169 static int hf_isup_mlpp_user_ind = -1;
1170
1171 static int hf_isup_access_delivery_ind =- -1;
1172
1173 static int hf_isup_transmission_medium_requirement_prime = -1;
1174
1175 static int hf_isup_loop_prevention_response_ind = -1;
1176
1177 static int hf_isup_temporary_alternative_routing_ind = -1;
1178 static int hf_isup_extension_ind = -1;
1179
1180 static int hf_isup_call_to_be_diverted_ind = -1;
1181
1182 static int hf_isup_call_to_be_offered_ind = -1;
1183
1184 static int hf_isup_conference_acceptance_ind = -1;
1185
1186 /* Initialize the subtree pointers */
1187 static gint ett_isup = -1;
1188 static gint ett_isup_parameter = -1;
1189 static gint ett_isup_address_digits = -1;
1190 static gint ett_isup_pass_along_message = -1;
1191 static gint ett_isup_circuit_state_ind = -1;
1192
1193
1194 /* ------------------------------------------------------------------ 
1195   Mapping number to ASCII-character   
1196  ------------------------------------------------------------------ */
1197 char number_to_char(int number)
1198 {
1199   if (number < 10)
1200     return ((char) number + ASCII_NUMBER_DELTA);
1201   else
1202     return ((char) number + ASCII_LETTER_DELTA);
1203 }
1204
1205
1206 /* ------------------------------------------------------------------ */
1207 /* Dissectors for all used parameter types                            */ 
1208 /* ------------------------------------------------------------------ */
1209 /* argument tvbuff_t contains only parameter-specific length          */
1210 /* length indicator is already dissected in dissect_isup_message() or */
1211 /* dissect_isup_optional_parameter()                                  */
1212 /* ------------------------------------------------------------------ */
1213
1214 /* ------------------------------------------------------------------ 
1215  Dissector Parameter nature of connection flags 
1216  */
1217 static void
1218 dissect_isup_nature_of_connection_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1219 {
1220   guint8 nature_of_connection_ind;
1221
1222   nature_of_connection_ind = tvb_get_guint8(parameter_tvb, 0);
1223   proto_tree_add_uint(parameter_tree, hf_isup_satellite_indicator, parameter_tvb, 0,NATURE_OF_CONNECTION_IND_LENGTH, nature_of_connection_ind);
1224   proto_tree_add_uint(parameter_tree, hf_isup_continuity_check_indicator, parameter_tvb, 0,NATURE_OF_CONNECTION_IND_LENGTH, nature_of_connection_ind);
1225   proto_tree_add_boolean(parameter_tree, hf_isup_echo_control_device_indicator, parameter_tvb, 0,  NATURE_OF_CONNECTION_IND_LENGTH, nature_of_connection_ind);
1226
1227   proto_item_set_text(parameter_item, "Nature of Connection Indicators: 0x%x", nature_of_connection_ind);
1228 }
1229
1230 /* ------------------------------------------------------------------ 
1231  Dissector Parameter Forward Call Indicators
1232  */
1233 static void
1234 dissect_isup_forward_call_indicators_parameter(tvbuff_t *parameter_tvb,proto_tree *parameter_tree, proto_item *parameter_item)
1235 {
1236   guint16 forward_call_ind;
1237
1238   forward_call_ind = tvb_get_ntohs(parameter_tvb, 0);
1239   proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_natnl_inatnl_call_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1240   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);
1241   proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_interworking_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1242   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);
1243   proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_isdn_user_part_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1244   proto_tree_add_uint(parameter_tree, hf_isup_forw_call_preferences_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1245   proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_isdn_access_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1246   proto_tree_add_uint(parameter_tree, hf_isup_forw_call_sccp_method_indicator, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
1247  
1248   proto_item_set_text(parameter_item, "Forward Call Indicators: 0x%x", forward_call_ind );  
1249 }
1250
1251 /* ------------------------------------------------------------------ 
1252  Dissector Parameter Calling Party's Category 
1253  */
1254 static void
1255 dissect_isup_calling_partys_category_parameter(tvbuff_t *parameter_tvb,proto_tree *parameter_tree, proto_item *parameter_item)
1256 {
1257   guint8 calling_partys_category;
1258   
1259   calling_partys_category = tvb_get_guint8(parameter_tvb, 0);
1260   proto_tree_add_uint(parameter_tree, hf_isup_calling_partys_category, parameter_tvb, 0, CALLING_PRTYS_CATEGORY_LENGTH, calling_partys_category);
1261
1262   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"));
1263 }
1264
1265
1266 /* ------------------------------------------------------------------
1267   Dissector Parameter Transmission medium requirement 
1268  */
1269 static void
1270 dissect_isup_transmission_medium_requirement_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1271
1272   guint8 transmission_medium_requirement;
1273   
1274   transmission_medium_requirement = tvb_get_guint8(parameter_tvb, 0);
1275   proto_tree_add_uint(parameter_tree, hf_isup_transmission_medium_requirement, parameter_tvb, 0, TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH,transmission_medium_requirement);
1276
1277   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"));
1278 }
1279 /* ------------------------------------------------------------------
1280   Dissector Parameter Called party number
1281  */
1282 static void
1283 dissect_isup_called_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1284 {
1285   proto_item *address_digits_item;
1286   proto_tree *address_digits_tree;
1287   guint8 indicators1, indicators2;
1288   guint8 address_digit_pair=0;
1289   gint offset=0; 
1290   gint i=0;
1291   gint length;
1292   char called_number[MAXLENGTH]="";
1293
1294   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1295   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1296   proto_tree_add_uint(parameter_tree, hf_isup_called_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1297   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1298   proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
1299   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1300   offset = 2;
1301
1302   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1303                                             offset, -1,
1304                                             "Called Party Number");
1305   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1306
1307   length = tvb_length_remaining(parameter_tvb, offset);
1308   while(length > 0){
1309     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1310     proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1311     called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1312     if ((length - 1) > 0 ){ 
1313       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1314       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1315     } 
1316     offset++;
1317     length = tvb_length_remaining(parameter_tvb, offset);   
1318   }
1319
1320   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1321       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1322       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1323   }
1324   called_number[i++] = '\0';
1325
1326   proto_item_set_text(address_digits_item, "Called Party Number: %s", called_number);  
1327   proto_item_set_text(parameter_item, "Called Party Number: %s", called_number);
1328   
1329 }
1330 /* ------------------------------------------------------------------
1331   Dissector Parameter  Subsequent number
1332  */
1333 static void
1334 dissect_isup_subsequent_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1335 {
1336   proto_item *address_digits_item;
1337   proto_tree *address_digits_tree;
1338   guint8 indicators1;
1339   guint8 address_digit_pair=0;
1340   gint offset=0; 
1341   gint i=0;
1342   gint length;
1343   char called_number[MAXLENGTH]="";
1344
1345   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1346   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1347   offset = 1;
1348
1349   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1350                                             offset, -1,
1351                                             "Subsequent Number");
1352   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1353
1354   length = tvb_length_remaining(parameter_tvb, offset);
1355   while(length > 0){
1356     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1357     proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1358     called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1359     if ((length - 1) > 0 ){ 
1360       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1361       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1362     } 
1363     offset++;
1364     length = tvb_length_remaining(parameter_tvb, offset);   
1365   }
1366
1367   if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1368       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1369       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1370   }
1371   called_number[i++] = '\0';
1372
1373   proto_item_set_text(address_digits_item, "Subsequent Number: %s", called_number);  
1374   proto_item_set_text(parameter_item, "Subsequent Number: %s", called_number);
1375   
1376 }
1377 /* ------------------------------------------------------------------
1378   Dissector Parameter Information Request Indicators
1379  */
1380 static void
1381 dissect_isup_information_request_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1382
1383   guint16 information_request_indicators;
1384   
1385   information_request_indicators = tvb_get_ntohs(parameter_tvb, 0);
1386   proto_tree_add_boolean(parameter_tree, hf_isup_calling_party_address_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1387   proto_tree_add_boolean(parameter_tree, hf_isup_info_req_holding_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1388   proto_tree_add_boolean(parameter_tree, hf_isup_calling_partys_category_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1389   proto_tree_add_boolean(parameter_tree, hf_isup_charge_information_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1390   proto_tree_add_boolean(parameter_tree, hf_isup_malicious_call_identification_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1391   
1392
1393   proto_item_set_text(parameter_item, "Information request indicators: 0x%x", information_request_indicators);
1394 }
1395 /* ------------------------------------------------------------------
1396   Dissector Parameter Information Indicators
1397  */
1398 static void
1399 dissect_isup_information_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1400
1401   guint16 information_indicators;
1402   
1403   information_indicators = tvb_get_ntohs(parameter_tvb, 0);
1404   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_address_response_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1405   proto_tree_add_boolean(parameter_tree, hf_isup_hold_provided_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1406   proto_tree_add_boolean(parameter_tree, hf_isup_calling_partys_category_response_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1407   proto_tree_add_boolean(parameter_tree, hf_isup_charge_information_response_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1408   proto_tree_add_boolean(parameter_tree, hf_isup_solicited_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1409   
1410
1411   proto_item_set_text(parameter_item, "Information indicators: 0x%x", information_indicators);
1412 }
1413 /* ------------------------------------------------------------------
1414   Dissector Parameter Continuity Indicators 
1415  */
1416 static void
1417 dissect_isup_continuity_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1418
1419   guint8 continuity_indicators;
1420   
1421   continuity_indicators = tvb_get_guint8(parameter_tvb, 0);
1422   proto_tree_add_boolean(parameter_tree, hf_isup_continuity_indicator, parameter_tvb, 0, CONTINUITY_IND_LENGTH,  continuity_indicators);
1423
1424   proto_item_set_text(parameter_item, "Continuity indicators: 0x%x", continuity_indicators);
1425 }
1426 /* ------------------------------------------------------------------ 
1427  Dissector Parameter Backward Call Indicators 
1428  */
1429 static void
1430 dissect_isup_backward_call_indicators_parameter(tvbuff_t *parameter_tvb,proto_tree *parameter_tree, proto_item *parameter_item)
1431 {
1432   guint16 backward_call_ind;
1433
1434   backward_call_ind = tvb_get_ntohs(parameter_tvb, 0);
1435   
1436
1437   proto_tree_add_uint(parameter_tree, hf_isup_backw_call_charge_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1438   proto_tree_add_uint(parameter_tree, hf_isup_backw_call_called_partys_status_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1439   proto_tree_add_uint(parameter_tree, hf_isup_backw_call_called_partys_category_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1440   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);
1441   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_interworking_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1442   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);
1443   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_isdn_user_part_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1444   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_holding_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH,  backward_call_ind);
1445   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_isdn_access_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1446   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_echo_control_device_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1447   proto_tree_add_uint(parameter_tree, hf_isup_backw_call_sccp_method_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1448  
1449   proto_item_set_text(parameter_item, "Backward Call Indicators: 0x%x", backward_call_ind);  
1450 }
1451 /* ------------------------------------------------------------------
1452   Dissector Parameter Cause Indicators - no detailed dissection since defined in Rec. Q.850
1453  */
1454 static void
1455 dissect_isup_cause_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1456 { guint length = tvb_length(parameter_tvb);
1457   proto_tree_add_text(parameter_tree, parameter_tvb,0, length, "Cause indicators (-> Q.850)"); 
1458   proto_item_set_text(parameter_item, "Cause indicators, see Q.850 (%u byte%s length)", length , plurality(length, "", "s"));
1459 }
1460
1461 /* ------------------------------------------------------------------
1462   Dissector Parameter Suspend/Resume Indicators 
1463  */
1464 static void
1465 dissect_isup_suspend_resume_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1466
1467   guint8 indicators;
1468   
1469   indicators = tvb_get_guint8(parameter_tvb, 0);
1470   proto_tree_add_boolean(parameter_tree, hf_isup_suspend_resume_indicator, parameter_tvb, 0, SUSPEND_RESUME_IND_LENGTH,  indicators);
1471
1472   proto_item_set_text(parameter_item, "Suspend/Resume indicator: 0x%x", indicators);
1473 }
1474 /* ------------------------------------------------------------------
1475   Dissector Parameter Range and Status Indicators 
1476  */
1477 static void
1478 dissect_isup_range_and_status_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1479
1480   guint8 range, actual_status_length;
1481
1482   range = tvb_get_guint8(parameter_tvb, 0);
1483   proto_tree_add_uint_format(parameter_tree, hf_isup_range_indicator, parameter_tvb, 0, RANGE_LENGTH, range, "Range: %u", range);
1484   actual_status_length = tvb_length_remaining(parameter_tvb, RANGE_LENGTH);
1485   if (actual_status_length > 0)
1486     proto_tree_add_text(parameter_tree, parameter_tvb , RANGE_LENGTH, actual_status_length, "Status subfield");
1487   else
1488     proto_tree_add_text(parameter_tree, parameter_tvb , 0, 0, "Status subfield is not present with this message type");
1489
1490
1491   proto_item_set_text(parameter_item, "Range (%u) and status", range);
1492 }
1493 /* ------------------------------------------------------------------
1494   Dissector Parameter Circuit group supervision message type
1495  */
1496 static void
1497 dissect_isup_circuit_group_supervision_message_type_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1498
1499   guint8 cgs_message_type;
1500   
1501   cgs_message_type = tvb_get_guint8(parameter_tvb, 0);
1502   proto_tree_add_uint(parameter_tree, hf_isup_cgs_message_type, parameter_tvb, 0, CIRC_GRP_SV_MSG_TYPE_LENGTH, cgs_message_type);
1503
1504   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);
1505 }
1506 /* ------------------------------------------------------------------
1507   Dissector Parameter Facility indicator parameter 
1508  */
1509 static void
1510 dissect_isup_facility_ind_parameter(tvbuff_t *parameter_tvb, proto_item *parameter_item)
1511
1512   guint8 indicator;
1513   
1514   indicator = tvb_get_guint8(parameter_tvb, 0);
1515
1516   proto_item_set_text(parameter_item, "Facility indicator: %s (%u)"  ,val_to_str(indicator, isup_facility_ind_value,"spare"), indicator);
1517 }
1518 /* ------------------------------------------------------------------
1519   Dissector Parameter Circuit state indicator 
1520  */
1521 static void
1522 dissect_isup_circuit_state_ind_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1523 {
1524   proto_item *circuit_state_item;
1525   proto_tree *circuit_state_tree;
1526   guint8 circuit_state;
1527   gint offset=0; 
1528   gint i=0;
1529   gint length;
1530
1531   length = tvb_length_remaining(parameter_tvb, offset);
1532   while(length > 0){
1533     circuit_state_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1534                                              offset,
1535                                              tvb_length_remaining(parameter_tvb, offset),
1536                                              "Circuit# CIC+%u state", i);
1537     circuit_state_tree = proto_item_add_subtree(circuit_state_item, ett_isup_circuit_state_ind);
1538     circuit_state = tvb_get_guint8(parameter_tvb, offset);
1539     if ((circuit_state & DC_8BIT_MASK) == 0){ 
1540       proto_tree_add_uint(circuit_state_tree, hf_isup_mtc_blocking_state1, parameter_tvb, offset, 1, circuit_state);
1541       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"));  
1542     } 
1543     else { 
1544       proto_tree_add_uint(circuit_state_tree, hf_isup_mtc_blocking_state2, parameter_tvb, offset, 1, circuit_state);
1545       proto_tree_add_uint(circuit_state_tree, hf_isup_call_proc_state, parameter_tvb, offset, 1, circuit_state);
1546       proto_tree_add_uint(circuit_state_tree, hf_isup_hw_blocking_state, parameter_tvb, offset, 1, circuit_state);
1547       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"));     
1548     } 
1549     offset++;
1550     length = tvb_length_remaining(parameter_tvb, offset);
1551   }
1552   proto_item_set_text(parameter_item, "Circuit state indicator (national use)");
1553 }
1554 /* ------------------------------------------------------------------
1555   Dissector Parameter Event information 
1556  */
1557 static void
1558 dissect_isup_event_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1559
1560   guint8 indicators;
1561   
1562   indicators = tvb_get_guint8(parameter_tvb, 0);
1563   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);
1564   proto_tree_add_boolean(parameter_tree, hf_isup_event_presentation_restricted_ind, parameter_tvb, 0, EVENT_INFO_LENGTH, indicators);
1565
1566   proto_item_set_text(parameter_item,"Event information: %s (%u)", val_to_str(indicators & GFEDCBA_8BIT_MASK, isup_event_ind_value, "spare"),indicators );
1567 }
1568 /* ------------------------------------------------------------------
1569   Dissector Parameter User-to-user information- no detailed dissection since defined in Rec. Q.931
1570  */
1571 static void
1572 dissect_isup_user_to_user_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1573 { guint length = tvb_length(parameter_tvb);
1574   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "User-to-user info (-> Q.931)"); 
1575   proto_item_set_text(parameter_item, "User-to-user information, see Q.931 (%u byte%s length)", length , plurality(length, "", "s"));
1576 }
1577 /* ------------------------------------------------------------------
1578   Dissector Parameter Call Reference 
1579  */
1580 static void
1581 dissect_isup_call_reference_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1582
1583   guint32 call_id;
1584   guint16 spc;
1585   
1586   call_id = tvb_get_ntoh24(parameter_tvb, 0);
1587   spc = tvb_get_letohs(parameter_tvb, CALL_ID_LENGTH) & 0x3FFF; /*since 1st 2 bits spare */
1588   proto_tree_add_text(parameter_tree, parameter_tvb, 0, CALL_ID_LENGTH, "Call identity: %u", call_id); 
1589   proto_tree_add_text(parameter_tree, parameter_tvb, CALL_ID_LENGTH, SPC_LENGTH, "Signalling Point Code: %u", spc); 
1590
1591   proto_item_set_text(parameter_item, "Call Reference: Call ID = %u, SPC = %u", call_id, spc);
1592 }
1593 /* ------------------------------------------------------------------
1594   Dissector Parameter Access Transport - no detailed dissection since defined in Rec. Q.931
1595  */
1596 static void
1597 dissect_isup_access_transport_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1598 { guint length = tvb_length(parameter_tvb);
1599   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Access transport parameter field (-> Q.931)"); 
1600   proto_item_set_text(parameter_item, "Access transport, see Q.931 (%u byte%s length)", length , plurality(length, "", "s"));
1601 }
1602 /* ------------------------------------------------------------------
1603   Dissector Parameter Optional Forward Call indicators
1604  */
1605 static void
1606 dissect_isup_optional_forward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1607
1608   guint8 indicators;
1609   
1610   indicators = tvb_get_guint8(parameter_tvb, 0);
1611   proto_tree_add_uint(parameter_tree, hf_isup_cug_call_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
1612   proto_tree_add_boolean(parameter_tree, hf_isup_simple_segmentation_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
1613   proto_tree_add_boolean(parameter_tree, hf_isup_connected_line_identity_request_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
1614
1615
1616   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 );
1617 }
1618 /* ------------------------------------------------------------------
1619   Dissector Parameter calling party number
1620  */
1621 static void
1622 dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1623 {
1624   proto_item *address_digits_item;
1625   proto_tree *address_digits_tree;
1626   guint8 indicators1, indicators2;
1627   guint8 address_digit_pair=0;
1628   gint offset=0; 
1629   gint i=0;
1630   gint length;
1631   char calling_number[MAXLENGTH]="";
1632
1633   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1634   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1635   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1636   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1637   proto_tree_add_boolean(parameter_tree, hf_isup_ni_indicator, parameter_tvb, 1, 1, indicators2);
1638   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1639   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
1640   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
1641   offset = 2;
1642
1643   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1644                                             offset, -1,
1645                                             "Calling Party Number");
1646   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1647
1648   length = tvb_length_remaining(parameter_tvb, offset);
1649   while(length > 0){
1650     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1651     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1652     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1653     if ((length - 1) > 0 ){ 
1654       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1655       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1656     } 
1657     offset++;
1658     length = tvb_length_remaining(parameter_tvb, offset);   
1659   }
1660
1661   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1662       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1663       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1664   }
1665   calling_number[i++] = '\0';
1666
1667   proto_item_set_text(address_digits_item, "Calling Party Number: %s", calling_number);  
1668   proto_item_set_text(parameter_item, "Calling Party Number: %s", calling_number);
1669   
1670 }
1671 /* ------------------------------------------------------------------
1672   Dissector Parameter Original called  number
1673  */
1674 static void
1675 dissect_isup_original_called_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1676 {
1677   proto_item *address_digits_item;
1678   proto_tree *address_digits_tree;
1679   guint8 indicators1, indicators2;
1680   guint8 address_digit_pair=0;
1681   gint offset=0; 
1682   gint i=0;
1683   gint length;
1684   char calling_number[MAXLENGTH]="";
1685
1686   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1687   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1688   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1689   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1690   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1691   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
1692   offset = 2;
1693
1694   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1695                                             offset, -1,
1696                                             "Original Called Number");
1697   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1698
1699   length = tvb_length_remaining(parameter_tvb, offset);
1700   while(length > 0){
1701     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1702     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1703     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1704     if ((length - 1) > 0 ){ 
1705       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1706       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1707     } 
1708     offset++;
1709     length = tvb_length_remaining(parameter_tvb, offset);   
1710   }
1711
1712   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1713       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1714       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1715   }
1716   calling_number[i++] = '\0';
1717
1718   proto_item_set_text(address_digits_item, "Original Called Number: %s", calling_number);  
1719   proto_item_set_text(parameter_item, "Original Called Number: %s", calling_number);
1720   
1721 }
1722 /* ------------------------------------------------------------------
1723   Dissector Parameter Redirecting number
1724  */
1725 static void
1726 dissect_isup_redirecting_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1727 {
1728   proto_item *address_digits_item;
1729   proto_tree *address_digits_tree;
1730   guint8 indicators1, indicators2;
1731   guint8 address_digit_pair=0;
1732   gint offset=0; 
1733   gint i=0;
1734   gint length;
1735   char calling_number[MAXLENGTH]="";
1736
1737   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1738   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1739   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1740   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1741   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1742   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
1743   offset = 2;
1744
1745   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1746                                             offset, -1,
1747                                             "Redirecting Number");
1748   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1749
1750   length = tvb_length_remaining(parameter_tvb, offset);
1751   while(length > 0){
1752     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1753     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1754     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1755     if ((length - 1) > 0 ){ 
1756       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1757       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1758     } 
1759     offset++;
1760     length = tvb_length_remaining(parameter_tvb, offset);   
1761   }
1762
1763   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1764       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1765       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1766   }
1767   calling_number[i++] = '\0';
1768
1769   proto_item_set_text(address_digits_item, "Redirecting Number: %s", calling_number);  
1770   proto_item_set_text(parameter_item, "Redirecting Number: %s", calling_number);
1771   
1772 }
1773 /* ------------------------------------------------------------------
1774   Dissector Parameter Redirection number 
1775  */
1776 static void
1777 dissect_isup_redirection_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1778 {
1779   proto_item *address_digits_item;
1780   proto_tree *address_digits_tree;
1781   guint8 indicators1, indicators2;
1782   guint8 address_digit_pair=0;
1783   gint offset=0; 
1784   gint i=0;
1785   gint length;
1786   char called_number[MAXLENGTH]="";
1787
1788   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1789   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1790   proto_tree_add_uint(parameter_tree, hf_isup_called_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1791   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1792   proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
1793   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1794   offset = 2;
1795
1796   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1797                                             offset, -1,
1798                                             "Redirection Number");
1799   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1800
1801   length = tvb_length_remaining(parameter_tvb, offset);
1802   while(length > 0){
1803     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1804     proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1805     called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1806     if ((length - 1) > 0 ){ 
1807       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1808       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1809     } 
1810     offset++;
1811     length = tvb_length_remaining(parameter_tvb, offset);   
1812   }
1813
1814   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1815       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1816       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1817   }
1818   called_number[i++] = '\0';
1819
1820   proto_item_set_text(address_digits_item, "Redirection Number: %s", called_number);  
1821   proto_item_set_text(parameter_item, "Redirection Number: %s", called_number); 
1822 }
1823 /* ------------------------------------------------------------------
1824   Dissector Parameter Connection request 
1825  */
1826 static void
1827 dissect_isup_connection_request_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1828
1829   guint32 local_ref;
1830   guint16 spc;
1831   guint8 protocol_class, credit, offset=0; 
1832   
1833   local_ref = tvb_get_ntoh24(parameter_tvb, 0);
1834   proto_tree_add_text(parameter_tree, parameter_tvb, offset, LOCAL_REF_LENGTH, "Local Reference: %u", local_ref); 
1835   offset = LOCAL_REF_LENGTH;
1836   spc = tvb_get_letohs(parameter_tvb,offset) & 0x3FFF; /*since 1st 2 bits spare */
1837   proto_tree_add_text(parameter_tree, parameter_tvb, offset, SPC_LENGTH, "Signalling Point Code: %u", spc); 
1838   offset += SPC_LENGTH;
1839   protocol_class = tvb_get_guint8(parameter_tvb, offset);
1840   proto_tree_add_text(parameter_tree, parameter_tvb, offset, PROTOCOL_CLASS_LENGTH, "Protocol Class: %u", protocol_class); 
1841   offset += PROTOCOL_CLASS_LENGTH;
1842   credit = tvb_get_guint8(parameter_tvb, offset);
1843   proto_tree_add_text(parameter_tree, parameter_tvb, offset, CREDIT_LENGTH, "Credit: %u", credit); 
1844   offset += CREDIT_LENGTH;
1845
1846   proto_item_set_text(parameter_item, "Connection request: Local Reference = %u, SPC = %u, Protocol Class = %u, Credit = %u", local_ref, spc, protocol_class, credit);
1847 }
1848 /* ------------------------------------------------------------------
1849   Dissector Parameter Redirection information
1850  */
1851 static void
1852 dissect_isup_redirection_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1853
1854   if (tvb_length(parameter_tvb) == 2){ 
1855     guint16 indicators;
1856     indicators = tvb_get_ntohs(parameter_tvb, 0);
1857     proto_tree_add_uint(parameter_tree, hf_isup_redirecting_ind, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
1858     proto_tree_add_uint(parameter_tree, hf_isup_original_redirection_reason, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
1859     proto_tree_add_uint(parameter_tree, hf_isup_redirection_counter, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
1860     proto_tree_add_uint(parameter_tree, hf_isup_redirection_reason, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
1861     proto_item_set_text(parameter_item, "Redirection Information");
1862   }
1863   else { /* ISUP'88 (blue book) */
1864     guint16 indicators;
1865     indicators = tvb_get_guint8(parameter_tvb, 0) * 0x100; /*since 2nd octet isn't present*/ 
1866     proto_tree_add_uint(parameter_tree, hf_isup_redirecting_ind, parameter_tvb, 0, 1, indicators);
1867     proto_tree_add_uint(parameter_tree, hf_isup_original_redirection_reason, parameter_tvb,0 , 1, indicators);
1868     proto_item_set_text(parameter_item, "Redirection Information (2nd octet not present since ISUP '88)");
1869   }
1870 }
1871 /* ------------------------------------------------------------------
1872   Dissector Parameter Closed user group interlock code
1873  */
1874 static void
1875 dissect_isup_closed_user_group_interlock_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1876 {
1877   char NI_digits[5]="";
1878   guint8 digit_pair;
1879   guint16 bin_code;
1880
1881   digit_pair = tvb_get_guint8(parameter_tvb, 0);
1882   NI_digits[0] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
1883   NI_digits[1] = number_to_char(digit_pair & DCBA_8BIT_MASK);
1884   digit_pair = tvb_get_guint8(parameter_tvb, 1);
1885   NI_digits[2] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
1886   NI_digits[3] = number_to_char(digit_pair & DCBA_8BIT_MASK);
1887   NI_digits[4] = '\0';
1888   proto_tree_add_text(parameter_tree, parameter_tvb, 0, 2, "Network Identity: %s", NI_digits); 
1889   bin_code = tvb_get_ntohs(parameter_tvb, 2);  
1890   proto_tree_add_text(parameter_tree, parameter_tvb, 3, 2, "Binary Code: 0x%x", bin_code); 
1891   proto_item_set_text(parameter_item, "Closed user group interlock code: NI = %s, Binary code = 0x%x", NI_digits, bin_code); 
1892 }
1893 /* ------------------------------------------------------------------
1894   Dissector Parameter User service information- no detailed dissection since defined in Rec. Q.931
1895  */
1896 static void
1897 dissect_isup_user_service_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1898 { guint length = tvb_length(parameter_tvb);
1899   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "User service information (-> Q.931)"); 
1900   proto_item_set_text(parameter_item, "User service information, see Q.931 (%u byte%s length)", length , plurality(length, "", "s"));
1901 }
1902 /* ------------------------------------------------------------------
1903   Dissector Parameter Signalling point code 
1904  */
1905 static void
1906 dissect_isup_signalling_point_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1907
1908   guint16 spc;
1909   
1910   spc = tvb_get_letohs(parameter_tvb, 0) & 0x3FFF; /*since 1st 2 bits spare */
1911   proto_tree_add_text(parameter_tree, parameter_tvb, 0, SIGNALLING_POINT_CODE_LENGTH, "Signalling Point Code: %u", spc); 
1912
1913   proto_item_set_text(parameter_item, "Signalling point code: %u", spc);
1914 }
1915 /* ------------------------------------------------------------------
1916   Dissector Parameter Connected number
1917  */
1918 static void
1919 dissect_isup_connected_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1920 {
1921   proto_item *address_digits_item;
1922   proto_tree *address_digits_tree;
1923   guint8 indicators1, indicators2;
1924   guint8 address_digit_pair=0;
1925   gint offset=0; 
1926   gint i=0;
1927   gint length;
1928   char calling_number[MAXLENGTH]="";
1929
1930   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1931   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1932   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1933   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1934   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1935   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
1936   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
1937   offset = 2;
1938
1939   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1940                                             offset, -1,
1941                                             "Connected Number");
1942   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1943
1944   length = tvb_length_remaining(parameter_tvb, offset);
1945   while(length > 0){
1946     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1947     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1948     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1949     if ((length - 1) > 0 ){ 
1950       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1951       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1952     } 
1953     offset++;
1954     length = tvb_length_remaining(parameter_tvb, offset);   
1955   }
1956
1957   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1958       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1959       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1960   }
1961   calling_number[i++] = '\0';
1962
1963   proto_item_set_text(address_digits_item, "Connected Number: %s", calling_number);  
1964   proto_item_set_text(parameter_item, "Connected Number: %s", calling_number);
1965   
1966 }
1967 /* ------------------------------------------------------------------
1968   Dissector Transit network selection
1969  */
1970 static void
1971 dissect_isup_transit_network_selection_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1972 {
1973   proto_item *address_digits_item;
1974   proto_tree *address_digits_tree;
1975   guint8 indicators;
1976   guint8 address_digit_pair=0;
1977   gint offset=0; 
1978   gint i=0;
1979   gint length;
1980   char network_id[MAXLENGTH]="";
1981
1982   indicators = tvb_get_guint8(parameter_tvb, 0);
1983   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators);
1984   proto_tree_add_uint(parameter_tree, hf_isup_type_of_network_identification, parameter_tvb, 0, 1, indicators);
1985   proto_tree_add_uint(parameter_tree, hf_isup_network_identification_plan, parameter_tvb, 0, 1, indicators);
1986   offset = 1;
1987
1988   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1989                                             offset, -1,
1990                                             "Network identification");
1991   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1992
1993   length = tvb_length_remaining(parameter_tvb, offset);
1994   while(length > 0){
1995     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1996     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1997     network_id[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1998     if ((length - 1) > 0 ){ 
1999       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2000       network_id[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2001     } 
2002     offset++;
2003     length = tvb_length_remaining(parameter_tvb, offset);   
2004   }
2005
2006   if  (((indicators & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2007       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2008       network_id[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2009   }
2010   network_id[i++] = '\0';
2011
2012   proto_item_set_text(address_digits_item, "Network identification: %s", network_id);  
2013   proto_item_set_text(parameter_item, "Transit network selection: %s", network_id);
2014   
2015 }
2016 /* ------------------------------------------------------------------
2017   Dissector Parameter Circuit assignment map
2018  */
2019 static void
2020 dissect_isup_circuit_assignment_map_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2021 { guint8 map_type;
2022
2023   map_type = tvb_get_guint8(parameter_tvb, 0);
2024   proto_tree_add_uint(parameter_tree, hf_isup_map_type, parameter_tvb, 0, 1, map_type); 
2025   proto_tree_add_text(parameter_tree, parameter_tvb, 1, 5, "Circuit assignment map (bit position indicates usage of corresponding circuit->3.69/Q.763)"); 
2026   proto_item_set_text(parameter_item, "Circuit assignment map");
2027 }
2028 /* ------------------------------------------------------------------
2029   Dissector Parameter Automatic congestion level
2030  */
2031 static void
2032 dissect_isup_automatic_congestion_level_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2033 { guint8 congestion_level;
2034
2035   congestion_level = tvb_get_guint8(parameter_tvb, 0);
2036   proto_tree_add_uint(parameter_tree, hf_isup_automatic_congestion_level, parameter_tvb, 0, AUTO_CONGEST_LEVEL_LENGTH, congestion_level); 
2037   proto_item_set_text(parameter_item, "Automatic congestion level: %s (%u)", val_to_str(congestion_level, isup_auto_congestion_level_value, "spare"), congestion_level);
2038 }
2039 /* ------------------------------------------------------------------
2040   Dissector Parameter Optional backward Call indicators
2041  */
2042 static void
2043 dissect_isup_optional_backward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2044
2045   guint8 indicators;
2046   
2047   indicators = tvb_get_guint8(parameter_tvb, 0);
2048   proto_tree_add_boolean(parameter_tree, hf_isup_inband_information_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
2049   proto_tree_add_boolean(parameter_tree, hf_isup_call_diversion_may_occur_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
2050   proto_tree_add_boolean(parameter_tree, hf_isup_simple_segmentation_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
2051   proto_tree_add_boolean(parameter_tree, hf_isup_mlpp_user_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
2052
2053
2054   proto_item_set_text(parameter_item,"Optional backward call indicators: 0x%x", indicators );
2055 }
2056 /* ------------------------------------------------------------------
2057   Dissector Parameter User-to-user indicators
2058  */
2059 static void
2060 dissect_isup_user_to_user_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2061
2062   guint8 indicators;
2063   
2064   indicators = tvb_get_guint8(parameter_tvb, 0);
2065   proto_tree_add_text(parameter_tree, parameter_tvb, 0, USER_TO_USER_IND_LENGTH, "User-to-user indicators: 0x%x (refer to 3.60/Q.763 for detailed decoding)", indicators );
2066   proto_item_set_text(parameter_item,"User-to-user indicators: 0x%x", indicators );
2067 }
2068 /* ------------------------------------------------------------------
2069   Dissector Parameter Original ISC point code 
2070  */
2071 static void
2072 dissect_isup_original_isc_point_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2073
2074   guint16 spc;
2075   
2076   spc = tvb_get_letohs(parameter_tvb, 0) & 0x3FFF; /*since 1st 2 bits spare */
2077   proto_tree_add_text(parameter_tree, parameter_tvb, 0, ORIGINAL_ISC_POINT_CODE_LENGTH, "Origination ISC Point Code: %u", spc); 
2078
2079   proto_item_set_text(parameter_item, "Origination ISC point code: %u", spc);
2080 }
2081 /* ------------------------------------------------------------------
2082   Dissector Parameter Generic notification indicator
2083  */
2084 static void
2085 dissect_isup_generic_notification_indicator_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2086
2087   guint8 indicators;
2088   
2089   indicators = tvb_get_guint8(parameter_tvb, 0);
2090   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 );
2091   proto_item_set_text(parameter_item,"Generic notification indicator: 0x%x", indicators );
2092 }
2093 /* ------------------------------------------------------------------
2094   Dissector Parameter Call history information
2095  */
2096 static void
2097 dissect_isup_call_history_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2098
2099   guint16 info;
2100   
2101   info = tvb_get_ntohs(parameter_tvb, 0);
2102   proto_tree_add_text(parameter_tree, parameter_tvb, 0, CALL_HISTORY_INFO_LENGTH, "Call history info: propagation delay = %u ms", info);
2103   proto_item_set_text(parameter_item,"Call history info: propagation delay = %u ms", info);
2104 }
2105 /* ------------------------------------------------------------------
2106   Dissector Parameter Access delivery information
2107  */
2108 static void
2109 dissect_isup_access_delivery_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2110 { guint8 indicator;
2111
2112   indicator = tvb_get_guint8(parameter_tvb, 0);
2113   proto_tree_add_boolean(parameter_tree, hf_isup_access_delivery_ind, parameter_tvb, 0, ACCESS_DELIVERY_INFO_LENGTH, indicator); 
2114   proto_item_set_text(parameter_item, "Access delivery information: 0x%x", indicator);
2115 }
2116 /* ------------------------------------------------------------------
2117   Dissector Parameter Network specific facility
2118  */
2119 static void
2120 dissect_isup_network_specific_facility_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2121 { guint length = tvb_length(parameter_tvb);
2122   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Network specific facility (refer to 3.36/Q.763 for detailed decoding)"); 
2123   proto_item_set_text(parameter_item, "Network specific facility (%u byte%s length)", length , plurality(length, "", "s"));
2124 }
2125 /* ------------------------------------------------------------------
2126   Dissector Parameter User service information prime 
2127  */
2128 static void
2129 dissect_isup_user_service_information_prime_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2130 { guint length = tvb_length(parameter_tvb);
2131   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "User service information prime (-> Q.931)"); 
2132   proto_item_set_text(parameter_item, "User service information prime, see Q.931 (%u byte%s length)", length , plurality(length, "", "s"));
2133 }
2134 /* ------------------------------------------------------------------
2135   Dissector Parameter Propagation delay counter
2136  */
2137 static void
2138 dissect_isup_propagation_delay_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2139
2140   guint16 info;
2141   
2142   info = tvb_get_ntohs(parameter_tvb, 0);
2143   proto_tree_add_text(parameter_tree, parameter_tvb, 0, PROPAGATION_DELAY_COUNT_LENGTH, "Propagation delay counter = %u ms", info);
2144   proto_item_set_text(parameter_item,"Propagation delay counter = %u ms", info);
2145 }
2146 /* ------------------------------------------------------------------
2147   Dissector Parameter Remote operations
2148  */
2149 static void
2150 dissect_isup_remote_operations_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2151 { guint length = tvb_length(parameter_tvb);
2152   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Remote operations"); 
2153   proto_item_set_text(parameter_item, "Remote operations (%u byte%s length)", length , plurality(length, "", "s"));
2154 }
2155 /* ------------------------------------------------------------------
2156   Dissector Parameter Service activation
2157  */
2158 static void
2159 dissect_isup_service_activation_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2160
2161   guint i;
2162   guint8 feature_code;
2163   guint length = tvb_length(parameter_tvb);
2164   for (i=0; i< length; i++){
2165     feature_code = tvb_get_guint8(parameter_tvb, i);
2166     proto_tree_add_text(parameter_tree, parameter_tvb, i, 1, "Feature Code %u: %u", i+1, feature_code); 
2167   }
2168   proto_item_set_text(parameter_item, "Service Activation (%u byte%s length)", length , plurality(length, "", "s"));
2169 }
2170 /* ------------------------------------------------------------------
2171   Dissector Parameter User service information prime - no detailed dissection since defined in Rec. Q.931
2172  */
2173 static void
2174 dissect_isup_user_teleservice_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2175
2176   proto_tree_add_text(parameter_tree, parameter_tvb, 0, USER_TELESERVICE_INFO_LENGTH, "User teleservice information (-> Q.931)"); 
2177   proto_item_set_text(parameter_item, "User teleservice information, see Q.931");
2178 }
2179 /* ------------------------------------------------------------------
2180   Dissector Parameter Transmission medium requirement used
2181  */
2182 static void
2183 dissect_isup_transmission_medium_used_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2184
2185   guint8 transmission_medium_requirement;
2186   
2187   transmission_medium_requirement = tvb_get_guint8(parameter_tvb, 0);
2188   proto_tree_add_uint(parameter_tree, hf_isup_transmission_medium_requirement_prime, parameter_tvb, 0, TRANSMISSION_MEDIUM_RQMT_PRIME_LENGTH,transmission_medium_requirement);
2189
2190   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"));
2191 }
2192 /* ------------------------------------------------------------------
2193   Dissector Parameter Call diversion information
2194  */
2195 static void
2196 dissect_isup_call_diversion_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2197 { guint8 indicator;
2198
2199   indicator = tvb_get_guint8(parameter_tvb, 0); 
2200   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);
2201   proto_item_set_text(parameter_item, "Call diversion information: 0x%x", indicator);
2202 }
2203 /* ------------------------------------------------------------------
2204   Dissector Parameter Echo control  information
2205  */
2206 static void
2207 dissect_isup_echo_control_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2208 { guint8 indicator;
2209
2210   indicator = tvb_get_guint8(parameter_tvb, 0); 
2211   proto_tree_add_text(parameter_tree, parameter_tvb, 0, ECHO_CONTROL_INFO_LENGTH, "Echo control information: 0x%x (refer to 3.19/Q.763 for detailed decoding)", indicator);
2212   proto_item_set_text(parameter_item, "Echo control information: 0x%x", indicator);
2213 }
2214 /* ------------------------------------------------------------------
2215   Dissector Parameter Message compatibility information
2216  */
2217 static void
2218 dissect_isup_message_compatibility_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2219 { guint length = tvb_length(parameter_tvb);
2220   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Message compatibility information (refer to 3.33/Q.763 for detailed decoding)"); 
2221   proto_item_set_text(parameter_item, "Message compatibility information (%u byte%s length)", length , plurality(length, "", "s"));
2222 }
2223 /* ------------------------------------------------------------------
2224   Dissector Parameter compatibility information
2225  */
2226 static void
2227 dissect_isup_parameter_compatibility_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2228
2229   guint length = tvb_length(parameter_tvb);
2230   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Parameter compatibility information (refer to 3.41/Q.763 for detailed decoding)"); 
2231   proto_item_set_text(parameter_item, "Parameter compatibility information (%u byte%s length)", length , plurality(length, "", "s"));
2232 }
2233 /* ------------------------------------------------------------------
2234   Dissector Parameter MLPP precedence
2235  */
2236 static void
2237 dissect_isup_mlpp_precedence_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2238 {
2239   char NI_digits[5]="";
2240   guint8 indicators, digit_pair;
2241   guint32 bin_code;
2242
2243   indicators = tvb_get_guint8(parameter_tvb, 0);
2244   proto_tree_add_text(parameter_tree, parameter_tvb, 0, 1, "LFB (Bits 6+7) and precedence level (Bits 1-4): 0x%x",indicators); 
2245   digit_pair = tvb_get_guint8(parameter_tvb, 1);
2246   NI_digits[0] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
2247   NI_digits[1] = number_to_char(digit_pair & DCBA_8BIT_MASK);
2248   digit_pair = tvb_get_guint8(parameter_tvb, 2);
2249   NI_digits[2] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
2250   NI_digits[3] = number_to_char(digit_pair & DCBA_8BIT_MASK);
2251   NI_digits[4] = '\0';
2252   proto_tree_add_text(parameter_tree, parameter_tvb, 1, 2, "Network Identity: %s", NI_digits); 
2253   bin_code = tvb_get_ntoh24(parameter_tvb, 3);  
2254   proto_tree_add_text(parameter_tree, parameter_tvb, 3, 3, "MLPP service domain: 0x%x", bin_code); 
2255   proto_item_set_text(parameter_item, "MLPP precedence: NI = %s, MLPP service domain = 0x%x", NI_digits, bin_code); 
2256 }
2257 /* ------------------------------------------------------------------
2258   Dissector Parameter MCID request indicators
2259  */
2260 static void
2261 dissect_isup_mcid_request_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2262 { guint8 indicator;
2263
2264   indicator = tvb_get_guint8(parameter_tvb, 0); 
2265   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);
2266   proto_item_set_text(parameter_item, "MCID request indicators: 0x%x", indicator);
2267 }
2268 /* ------------------------------------------------------------------
2269   Dissector Parameter MCID response indicators
2270  */
2271 static void
2272 dissect_isup_mcid_response_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2273 { guint8 indicator;
2274
2275   indicator = tvb_get_guint8(parameter_tvb, 0); 
2276   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);
2277   proto_item_set_text(parameter_item, "MCID response indicators: 0x%x", indicator);
2278 }
2279 /* ------------------------------------------------------------------
2280   Dissector Parameter Hop counter
2281  */
2282 static void
2283 dissect_isup_hop_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2284 { guint8 counter;
2285
2286   counter = tvb_get_guint8(parameter_tvb, 0) & EDCBA_8BIT_MASK; /* since bits H,G and F are spare */ 
2287   proto_tree_add_text(parameter_tree, parameter_tvb, 0, HOP_COUNTER_LENGTH, "Hop counter: %u", counter);
2288   proto_item_set_text(parameter_item,  "Hop counter: %u", counter);
2289 }
2290 /* ------------------------------------------------------------------
2291   Dissector Parameter Transmission medium requirement prime
2292  */
2293 static void
2294 dissect_isup_transmission_medium_requirement_prime_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2295
2296   guint8 transmission_medium_requirement;
2297   
2298   transmission_medium_requirement = tvb_get_guint8(parameter_tvb, 0);
2299   proto_tree_add_uint(parameter_tree, hf_isup_transmission_medium_requirement_prime, parameter_tvb, 0, TRANSMISSION_MEDIUM_RQMT_PRIME_LENGTH,transmission_medium_requirement);
2300
2301   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"));
2302 }
2303
2304 /* ------------------------------------------------------------------
2305   Dissector Parameter location number
2306  */
2307 static void
2308 dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2309 {
2310   proto_item *address_digits_item;
2311   proto_tree *address_digits_tree;
2312   guint8 indicators1, indicators2;
2313   guint8 address_digit_pair=0;
2314   gint offset=0; 
2315   gint i=0;
2316   gint length;
2317   char calling_number[MAXLENGTH]="";
2318
2319   indicators1 = tvb_get_guint8(parameter_tvb, 0);
2320   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
2321   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2322   indicators2 = tvb_get_guint8(parameter_tvb, 1);
2323   proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
2324   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
2325   if ((indicators2 & GFE_8BIT_MASK) == 0x50)
2326     proto_tree_add_text(parameter_tree, parameter_tvb, 1, 1, "Different meaning for Location Number: Numbering plan indicator = private numbering plan");
2327   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
2328   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
2329   offset = 2;
2330
2331   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2332                                             offset, -1,
2333                                             "Location number");
2334   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2335
2336   length = tvb_length_remaining(parameter_tvb, offset);
2337   while(length > 0){
2338     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2339     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2340     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2341     if ((length - 1) > 0 ){ 
2342       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2343       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2344     } 
2345     offset++;
2346     length = tvb_length_remaining(parameter_tvb, offset);   
2347   }
2348
2349   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2350       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2351       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2352   }
2353   calling_number[i++] = '\0';
2354
2355   proto_item_set_text(address_digits_item, "Location number: %s", calling_number);  
2356   proto_item_set_text(parameter_item, "Location number: %s", calling_number);
2357   
2358 }
2359 /* ------------------------------------------------------------------
2360   Dissector Parameter Redirection number restiriction
2361  */
2362 static void
2363 dissect_isup_redirection_number_restriction_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2364
2365   guint8 indicator;
2366   
2367   indicator = tvb_get_guint8(parameter_tvb, 0);
2368   switch (indicator & BA_8BIT_MASK) {
2369   case 0:
2370     proto_tree_add_text(parameter_tree, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: Presentation allowed");
2371     break;
2372   case 1:
2373     proto_tree_add_text(parameter_tree, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: Presentation restricted");
2374     break;
2375   default:
2376     proto_tree_add_text(parameter_tree, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: spare");
2377     break;
2378   }
2379   proto_item_set_text(parameter_item, "Redirection number restriction: 0x%x ", indicator); 
2380 }
2381 /* ------------------------------------------------------------------
2382   Dissector Parameter Call transfer identity
2383  */
2384 static void
2385 dissect_isup_call_transfer_reference_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2386 { guint8 id;
2387
2388   id = tvb_get_guint8(parameter_tvb, 0);
2389   proto_tree_add_text(parameter_tree, parameter_tvb, 0, CALL_TRANSFER_REF_LENGTH, "Call transfer identity: %u", id);
2390   proto_item_set_text(parameter_item,  "Call transfer reference: %u", id);
2391 }
2392 /* ------------------------------------------------------------------
2393   Dissector Parameter Loop prevention
2394  */
2395 static void
2396 dissect_isup_loop_prevention_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2397
2398   guint8 indicator;
2399   
2400   indicator = tvb_get_guint8(parameter_tvb, 0);
2401   if ((indicator & A_8BIT_MASK)==0) {
2402     proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "Type: Request");
2403     proto_item_set_text(parameter_item, "Loop prevention indicators: Request (%u)", indicator); 
2404   }
2405   else {
2406     proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "Type: Response");
2407     proto_tree_add_uint(parameter_tree, hf_isup_loop_prevention_response_ind, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, indicator);
2408     proto_item_set_text(parameter_item, "Loop prevention indicators: Response (%u)", indicator); 
2409   }
2410 }
2411 /* ------------------------------------------------------------------
2412   Dissector Parameter Call transfer number
2413  */
2414 static void
2415 dissect_isup_call_transfer_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2416 {
2417   proto_item *address_digits_item;
2418   proto_tree *address_digits_tree;
2419   guint8 indicators1, indicators2;
2420   guint8 address_digit_pair=0;
2421   gint offset=0; 
2422   gint i=0;
2423   gint length;
2424   char calling_number[MAXLENGTH]="";
2425
2426   indicators1 = tvb_get_guint8(parameter_tvb, 0);
2427   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
2428   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2429   indicators2 = tvb_get_guint8(parameter_tvb, 1);
2430   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
2431   if ((indicators2 & GFE_8BIT_MASK) == 0x50)
2432     proto_tree_add_text(parameter_tree, parameter_tvb, 1, 1, "Different meaning for Call Transfer Number: Numbering plan indicator = private numbering plan");
2433   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
2434   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 1, 1, indicators2);
2435   offset = 2;
2436
2437   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2438                                             offset, -1,
2439                                             "Call transfer number");
2440   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2441
2442   length = tvb_length_remaining(parameter_tvb, offset);
2443   while(length > 0){
2444     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2445     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2446     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2447     if ((length - 1) > 0 ){ 
2448       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2449       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2450     } 
2451     offset++;
2452     length = tvb_length_remaining(parameter_tvb, offset);   
2453   }
2454
2455   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2456       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2457       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2458   }
2459   calling_number[i++] = '\0';
2460
2461   proto_item_set_text(address_digits_item, "Call transfer number: %s", calling_number);  
2462   proto_item_set_text(parameter_item, "Call transfer number: %s", calling_number);
2463   
2464 }
2465 /* ------------------------------------------------------------------
2466   Dissector Parameter CCSS
2467  */
2468 static void
2469 dissect_isup_ccss_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2470
2471   guint8 indicator;
2472   
2473   indicator = tvb_get_guint8(parameter_tvb, 0);
2474   if ((indicator & A_8BIT_MASK)==0) {
2475     proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "CCSS call indicator: no indication");
2476     proto_item_set_text(parameter_item, "CCSS call indicator: no indication (%u)", indicator); 
2477   }
2478   else {
2479     proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "CCSS call indicator: CCSS call");
2480     proto_item_set_text(parameter_item, "CCSS call indicator: CCSS call (%u)", indicator); 
2481   }
2482 }
2483 /* ------------------------------------------------------------------ 
2484  Parameter Forward GVNS 
2485  */
2486 static void
2487 dissect_isup_forward_gvns_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2488 { guint length = tvb_length(parameter_tvb);
2489   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Forward GVNS (refer to 3.66/Q.763 for detailed decoding)");
2490   proto_item_set_text(parameter_item, "Forward GVNS (%u Byte%s)", length , plurality(length, "", "s"));
2491 }
2492 /* ------------------------------------------------------------------ 
2493  Parameter Redirect capability
2494  */
2495 static void
2496 dissect_isup_redirect_capability_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2497 { guint length = tvb_length(parameter_tvb);
2498   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Redirect capability (format is a national matter)");
2499   proto_item_set_text(parameter_item, "Redirect Capability (%u Byte%s)", length , plurality(length, "", "s"));
2500 }
2501 /* ------------------------------------------------------------------
2502   Dissector Parameter Backward GVNS
2503  */
2504 static void
2505 dissect_isup_backward_gvns_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2506 { guint8 indicator;
2507
2508   indicator = tvb_get_guint8(parameter_tvb, 0); 
2509   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);
2510   proto_item_set_text(parameter_item, "Backward GVNS: 0x%x", indicator);
2511 }
2512 /* ------------------------------------------------------------------
2513   Dissector Parameter Network management controls
2514  */
2515 static void
2516 dissect_isup_network_management_controls_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2517 { guint8 indicator;
2518
2519   indicator = tvb_get_guint8(parameter_tvb, 0); 
2520   proto_tree_add_boolean(parameter_tree, hf_isup_temporary_alternative_routing_ind, parameter_tvb, 0,NETWORK_MANAGEMENT_CONTROLS_LENGTH, indicator);
2521   proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0,NETWORK_MANAGEMENT_CONTROLS_LENGTH, indicator);
2522   proto_item_set_text(parameter_item, "Network management controls: 0x%x", indicator);
2523 }
2524 /* ------------------------------------------------------------------
2525   Dissector Parameter Correlation id - no detailed dissection since defined in Rec. Q.1281
2526  */
2527 static void
2528 dissect_isup_correlation_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2529 { guint length = tvb_length(parameter_tvb);
2530   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Correlation ID (-> Q.1281)"); 
2531   proto_item_set_text(parameter_item, "Correlation ID, see Q.1281 (%u Byte%s)", length , plurality(length, "", "s"));
2532 }
2533 /* ------------------------------------------------------------------
2534   Dissector Parameter SCF id - no detailed dissection since defined in Rec. Q.1281
2535  */
2536 static void
2537 dissect_isup_scf_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2538 { guint length = tvb_length(parameter_tvb);
2539   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "SCF ID (-> Q.1281)"); 
2540   proto_item_set_text(parameter_item, "SCF ID, see Q.1281 (%u Byte%s)", length , plurality(length, "", "s"));
2541 }
2542 /* ------------------------------------------------------------------
2543   Dissector Parameter Call diversion treatment indicators
2544  */
2545 static void
2546 dissect_isup_call_diversion_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2547 { guint8 indicator;
2548
2549   indicator = tvb_get_guint8(parameter_tvb, 0); 
2550   proto_tree_add_uint(parameter_tree, hf_isup_call_to_be_diverted_ind, parameter_tvb, 0,CALL_DIV_TREATMENT_IND_LENGTH, indicator);
2551   proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CALL_DIV_TREATMENT_IND_LENGTH, indicator);
2552   proto_item_set_text(parameter_item, "Call diversion treatment indicators: 0x%x", indicator);
2553 }
2554 /* ------------------------------------------------------------------
2555   Dissector Parameter called IN  number
2556  */
2557 static void
2558 dissect_isup_called_in_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2559 {
2560   proto_item *address_digits_item;
2561   proto_tree *address_digits_tree;
2562   guint8 indicators1, indicators2;
2563   guint8 address_digit_pair=0;
2564   gint offset=0; 
2565   gint i=0;
2566   gint length;
2567   char calling_number[MAXLENGTH]="";
2568
2569   indicators1 = tvb_get_guint8(parameter_tvb, 0);
2570   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
2571   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2572   indicators2 = tvb_get_guint8(parameter_tvb, 1);
2573   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
2574   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
2575   offset = 2;
2576
2577   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2578                                             offset, -1,
2579                                             "Called IN Number");
2580   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2581
2582   length = tvb_length_remaining(parameter_tvb, offset);
2583   while(length > 0){
2584     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2585     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2586     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2587     if ((length - 1) > 0 ){ 
2588       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2589       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2590     } 
2591     offset++;
2592     length = tvb_length_remaining(parameter_tvb, offset);   
2593   }
2594
2595   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2596       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2597       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2598   }
2599   calling_number[i++] = '\0';
2600
2601   proto_item_set_text(address_digits_item, "Called IN Number: %s", calling_number);  
2602   proto_item_set_text(parameter_item, "Called IN Number: %s", calling_number);
2603   
2604 }
2605 /* ------------------------------------------------------------------
2606   Dissector Parameter Call offering treatment indicators
2607  */
2608 static void
2609 dissect_isup_call_offering_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2610 { guint8 indicator;
2611
2612   indicator = tvb_get_guint8(parameter_tvb, 0); 
2613   proto_tree_add_uint(parameter_tree, hf_isup_call_to_be_offered_ind, parameter_tvb, 0,CALL_OFFERING_TREATMENT_IND_LENGTH, indicator);
2614   proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CALL_OFFERING_TREATMENT_IND_LENGTH, indicator);
2615   proto_item_set_text(parameter_item, "Call offering treatment indicators: 0x%x", indicator);
2616 }
2617 /* ------------------------------------------------------------------ 
2618  Parameter Charged party identification
2619  */
2620 static void
2621 dissect_isup_charged_party_identification_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2622 { guint length = tvb_length(parameter_tvb);
2623   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Charged party identification (format is national network specific)");
2624   proto_item_set_text(parameter_item, "Charged party identification (%u Byte%s)", length , plurality(length, "", "s"));
2625 }
2626 /* ------------------------------------------------------------------
2627   Dissector Parameter Conference treatment indicators
2628  */
2629 static void
2630 dissect_isup_conference_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2631 { guint8 indicator;
2632
2633   indicator = tvb_get_guint8(parameter_tvb, 0); 
2634   proto_tree_add_uint(parameter_tree, hf_isup_conference_acceptance_ind, parameter_tvb, 0,CONFERENCE_TREATMENT_IND_LENGTH, indicator);
2635   proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CONFERENCE_TREATMENT_IND_LENGTH, indicator);
2636   proto_item_set_text(parameter_item, "Conference treatment indicators: 0x%x", indicator);
2637 }
2638 /* ------------------------------------------------------------------
2639   Dissector Parameter Display information
2640  */
2641 static void
2642 dissect_isup_display_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2643 { guint length = tvb_length(parameter_tvb);
2644   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Display information (-> Q.931)");
2645   proto_item_set_text(parameter_item, "Display information (%u Byte%s)", length , plurality(length, "", "s"));
2646 }
2647 /* ------------------------------------------------------------------ 
2648  Parameter UID action indicators
2649  */
2650 static void
2651 dissect_isup_uid_action_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2652 { guint8 indicator;
2653
2654   indicator = tvb_get_guint8(parameter_tvb, 0); 
2655   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);
2656   proto_item_set_text(parameter_item, "UID action indicators: 0x%x", indicator);
2657 }
2658 /* ------------------------------------------------------------------ 
2659  Parameter UID capability indicators
2660  */
2661 static void
2662 dissect_isup_uid_capability_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2663 { guint8 indicator;
2664
2665   indicator = tvb_get_guint8(parameter_tvb, 0); 
2666   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);
2667   proto_item_set_text(parameter_item, "UID capability indicators: 0x%x", indicator);
2668 }
2669 /* ------------------------------------------------------------------ 
2670  Parameter Redirect counter
2671  */
2672 static void
2673 dissect_isup_redirect_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2674 { guint length = tvb_length(parameter_tvb);
2675   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Redirect counter (format is a national matter)");
2676   proto_item_set_text(parameter_item, "Redirect counter (%u Byte%s)", length , plurality(length, "", "s"));
2677 }
2678 /* ------------------------------------------------------------------
2679   Dissector Parameter Collect call request
2680  */
2681 static void
2682 dissect_isup_collect_call_request_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2683 { guint8 indicator;
2684
2685   indicator = tvb_get_guint8(parameter_tvb, 0); 
2686   if ((indicator & A_8BIT_MASK) == 0) {
2687     proto_tree_add_text(parameter_tree, parameter_tvb, 0, COLLECT_CALL_REQUEST_LENGTH, "Collect call request indicator: no indication");
2688     proto_item_set_text(parameter_item, "Collect call reqeust: no indication (0x%x)", indicator);
2689   }
2690   else {
2691     proto_tree_add_text(parameter_tree, parameter_tvb, 0, COLLECT_CALL_REQUEST_LENGTH, "Collect call request indicator: collect call requested");
2692     proto_item_set_text(parameter_item, "Collect call reqeust: collect call requested (0x%x)", indicator);
2693   }
2694 }
2695 /* ------------------------------------------------------------------
2696   Dissector Parameter Generic number
2697  */
2698 static void
2699 dissect_isup_generic_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2700 {
2701   proto_item *address_digits_item;
2702   proto_tree *address_digits_tree;
2703   guint8 indicators1, indicators2, nr_qualifier_ind;
2704   guint8 address_digit_pair=0;
2705   gint offset=0; 
2706   gint i=0;
2707   gint length;
2708   char calling_number[MAXLENGTH]="";
2709
2710   nr_qualifier_ind = tvb_get_guint8(parameter_tvb, 0);
2711   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);
2712   indicators1 = tvb_get_guint8(parameter_tvb, 1);
2713   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 1, 1, indicators1);
2714   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2715   indicators2 = tvb_get_guint8(parameter_tvb, 2);
2716   proto_tree_add_boolean(parameter_tree, hf_isup_ni_indicator, parameter_tvb, 2, 1, indicators2);
2717   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 2, 1, indicators2);
2718   if ((indicators2 & GFE_8BIT_MASK) == 0x50)
2719     proto_tree_add_text(parameter_tree, parameter_tvb, 2, 1, "Different meaning for Generic Number: Numbering plan indicator = private numbering plan");
2720   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 2, 1, indicators2);
2721   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 2, 1, indicators2);
2722   offset = 3;
2723
2724   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2725                                             offset, -1,
2726                                             "Generic number");
2727   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2728
2729   length = tvb_length_remaining(parameter_tvb, offset);
2730   while(length > 0){
2731     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2732     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2733     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2734     if ((length - 1) > 0 ){ 
2735       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2736       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2737     } 
2738     offset++;
2739     length = tvb_length_remaining(parameter_tvb, offset);   
2740   }
2741
2742   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2743       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2744       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2745   }
2746   calling_number[i++] = '\0';
2747
2748   proto_item_set_text(address_digits_item, "Generic number: %s", calling_number);  
2749   proto_item_set_text(parameter_item, "Generic number: %s", calling_number);
2750   
2751 }
2752 /* ------------------------------------------------------------------ 
2753  Dissector Parameter Generic digits
2754  */
2755 static void
2756 dissect_isup_generic_digits_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2757 { guint length = tvb_length(parameter_tvb);
2758   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Generic digits (refer to 3.24/Q.673 for detailed decoding)");
2759   proto_item_set_text(parameter_item, "Generic digits (%u Byte%s)", length , plurality(length, "", "s"));
2760 }
2761 /* ------------------------------------------------------------------ */
2762 static void
2763 dissect_isup_unknown_parameter(tvbuff_t *parameter_tvb, proto_item *parameter_item)
2764 { guint length = tvb_length(parameter_tvb);
2765   proto_item_set_text(parameter_item, "Parameter Type unknown/reserved (%u Byte%s)", length , plurality(length, "", "s"));
2766 }
2767 /* ------------------------------------------------------------------ */
2768
2769 /* ------------------------------------------------------------------
2770   Dissector all optional parameters
2771 */
2772 static void
2773 dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, proto_tree *isup_tree)
2774 { proto_item* parameter_item;
2775   proto_tree* parameter_tree;
2776   gint offset = 0;
2777   guint parameter_type, parameter_length, actual_length;
2778   tvbuff_t *parameter_tvb;
2779
2780   /* Dissect all optional parameters while end of message isn't reached */
2781   parameter_type = 0xFF; /* Start-initializiation since parameter_type is used for while-condition */
2782   
2783   while ((tvb_length_remaining(optional_parameters_tvb, offset)  >= 1) && (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS)){
2784     parameter_type = tvb_get_guint8(optional_parameters_tvb, offset);
2785     
2786     if (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS){
2787       parameter_length = tvb_get_guint8(optional_parameters_tvb, offset + PARAMETER_TYPE_LENGTH);
2788       
2789       parameter_item = proto_tree_add_text(isup_tree, optional_parameters_tvb,
2790                                            offset,
2791                                            parameter_length  + PARAMETER_TYPE_LENGTH + PARAMETER_LENGTH_IND_LENGTH,
2792                                            "Parameter: type %u",
2793                                            parameter_type);
2794       parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
2795       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"));       
2796       offset += PARAMETER_TYPE_LENGTH;
2797       
2798       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);
2799       offset += PARAMETER_LENGTH_IND_LENGTH;
2800       
2801       actual_length = tvb_length_remaining(optional_parameters_tvb, offset);
2802       if (actual_length > 0){
2803         parameter_tvb = tvb_new_subset(optional_parameters_tvb, offset, MIN(parameter_length, actual_length), parameter_length);
2804         switch (parameter_type) {
2805         case PARAM_TYPE_CALL_REF:
2806           dissect_isup_call_reference_parameter(parameter_tvb, parameter_tree, parameter_item);
2807           break;
2808         case PARAM_TYPE_TRANSM_MEDIUM_REQU:
2809           dissect_isup_transmission_medium_requirement_parameter(parameter_tvb, parameter_tree, parameter_item);
2810           break;
2811         case PARAM_TYPE_ACC_TRANSP:
2812           dissect_isup_access_transport_parameter(parameter_tvb, parameter_tree, parameter_item);
2813           break;
2814         case PARAM_TYPE_CALLED_PARTY_NR:
2815           dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2816           break;
2817         case PARAM_TYPE_SUBSQT_NR:
2818           dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2819           break;
2820         case PARAM_TYPE_NATURE_OF_CONN_IND:
2821           dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2822           break;
2823         case PARAM_TYPE_FORW_CALL_IND:
2824           dissect_isup_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2825           break;
2826         case PARAM_TYPE_OPT_FORW_CALL_IND:
2827           dissect_isup_optional_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2828           break;
2829         case PARAM_TYPE_CALLING_PRTY_CATEG:
2830           dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item);
2831           break;
2832         case PARAM_TYPE_CALLING_PARTY_NR:
2833           dissect_isup_calling_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2834           break;
2835         case PARAM_TYPE_REDIRECTING_NR:
2836           dissect_isup_redirecting_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2837           break;
2838         case PARAM_TYPE_REDIRECTION_NR:
2839           dissect_isup_redirection_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2840           break;
2841         case PARAM_TYPE_CONNECTION_REQ:
2842           dissect_isup_connection_request_parameter(parameter_tvb, parameter_tree, parameter_item);
2843           break;
2844         case PARAM_TYPE_INFO_REQ_IND:
2845           dissect_isup_information_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2846           break;
2847         case PARAM_TYPE_INFO_IND:
2848           dissect_isup_information_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2849           break;
2850         case PARAM_TYPE_CONTINUITY_IND:
2851           dissect_isup_continuity_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2852           break;
2853         case PARAM_TYPE_BACKW_CALL_IND:
2854           dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2855           break;
2856         case PARAM_TYPE_CAUSE_INDICATORS:
2857           dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2858           break;
2859         case PARAM_TYPE_REDIRECTION_INFO:
2860           dissect_isup_redirection_information_parameter(parameter_tvb, parameter_tree, parameter_item);
2861           break;
2862         case PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE:
2863           dissect_isup_circuit_group_supervision_message_type_parameter(parameter_tvb, parameter_tree, parameter_item);
2864           break;
2865         case PARAM_TYPE_RANGE_AND_STATUS:
2866           dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
2867           break;
2868         case PARAM_TYPE_FACILITY_IND:
2869           dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
2870           break;
2871         case PARAM_TYPE_CLSD_USR_GRP_ILOCK_CD:
2872           dissect_isup_closed_user_group_interlock_code_parameter(parameter_tvb, parameter_tree, parameter_item);
2873           break;
2874         case PARAM_TYPE_USER_SERVICE_INFO:
2875           dissect_isup_user_service_information_parameter(parameter_tvb, parameter_tree, parameter_item);
2876           break;
2877         case PARAM_TYPE_SIGNALLING_POINT_CODE:
2878           dissect_isup_signalling_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);    
2879           break;
2880         case PARAM_TYPE_USER_TO_USER_INFO:
2881           dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
2882           break;
2883         case PARAM_TYPE_CONNECTED_NR:
2884           dissect_isup_connected_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2885           break;
2886         case PARAM_TYPE_SUSP_RESUME_IND:
2887           dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2888           break;
2889         case PARAM_TYPE_TRANSIT_NETW_SELECT:
2890           dissect_isup_transit_network_selection_parameter(parameter_tvb, parameter_tree, parameter_item);
2891           break;
2892         case PARAM_TYPE_EVENT_INFO:
2893           dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item);
2894           break;
2895         case PARAM_TYPE_CIRC_ASSIGN_MAP:
2896           dissect_isup_circuit_assignment_map_parameter(parameter_tvb, parameter_tree, parameter_item);
2897           break;
2898         case PARAM_TYPE_CIRC_STATE_IND:
2899           dissect_isup_circuit_state_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
2900           break;
2901         case PARAM_TYPE_AUTO_CONG_LEVEL:
2902           dissect_isup_automatic_congestion_level_parameter(parameter_tvb, parameter_tree, parameter_item);
2903           break;
2904         case PARAM_TYPE_ORIG_CALLED_NR:
2905           dissect_isup_original_called_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2906           break;
2907         case PARAM_TYPE_OPT_BACKW_CALL_IND:
2908           dissect_isup_optional_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2909           break;
2910         case PARAM_TYPE_USER_TO_USER_IND:
2911           dissect_isup_user_to_user_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2912           break;
2913         case PARAM_TYPE_ORIG_ISC_POINT_CODE:
2914           dissect_isup_original_isc_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);          
2915           break;
2916         case PARAM_TYPE_GENERIC_NOTIF_IND:
2917           dissect_isup_generic_notification_indicator_parameter(parameter_tvb, parameter_tree, parameter_item);   
2918           break;
2919         case PARAM_TYPE_CALL_HIST_INFO :
2920           dissect_isup_call_history_information_parameter(parameter_tvb, parameter_tree, parameter_item);         
2921           break;
2922         case PARAM_TYPE_ACC_DELIV_INFO:
2923           dissect_isup_access_delivery_information_parameter(parameter_tvb, parameter_tree, parameter_item);      
2924           break;
2925         case PARAM_TYPE_NETW_SPECIFIC_FACLTY:
2926           dissect_isup_network_specific_facility_parameter(parameter_tvb, parameter_tree, parameter_item);        
2927           break;
2928         case PARAM_TYPE_USER_SERVICE_INFO_PR:
2929           dissect_isup_user_service_information_prime_parameter(parameter_tvb, parameter_tree, parameter_item);   
2930           break;
2931         case PARAM_TYPE_PROPAG_DELAY_COUNTER:
2932           dissect_isup_propagation_delay_counter_parameter(parameter_tvb, parameter_tree, parameter_item);        
2933           break;
2934         case PARAM_TYPE_REMOTE_OPERATIONS:
2935           dissect_isup_remote_operations_parameter(parameter_tvb, parameter_tree, parameter_item);        
2936           break;
2937         case PARAM_TYPE_SERVICE_ACTIVATION:
2938           dissect_isup_service_activation_parameter(parameter_tvb, parameter_tree, parameter_item);       
2939           break;
2940         case PARAM_TYPE_USER_TELESERV_INFO:
2941           dissect_isup_user_teleservice_information_parameter(parameter_tvb, parameter_tree, parameter_item);     
2942           break;
2943         case PARAM_TYPE_TRANSM_MEDIUM_USED:
2944           dissect_isup_transmission_medium_used_parameter(parameter_tvb, parameter_tree, parameter_item);         
2945           break;
2946         case PARAM_TYPE_CALL_DIV_INFO:
2947           dissect_isup_call_diversion_information_parameter(parameter_tvb, parameter_tree, parameter_item);       
2948           break;
2949         case PARAM_TYPE_ECHO_CTRL_INFO:
2950           dissect_isup_echo_control_information_parameter(parameter_tvb, parameter_tree, parameter_item);         
2951           break;
2952         case PARAM_TYPE_MSG_COMPAT_INFO:
2953           dissect_isup_message_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);        
2954           break;
2955         case PARAM_TYPE_PARAM_COMPAT_INFO:
2956           dissect_isup_parameter_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);      
2957           break;
2958         case PARAM_TYPE_MLPP_PRECEDENCE:
2959           dissect_isup_mlpp_precedence_parameter(parameter_tvb, parameter_tree, parameter_item);          
2960           break;
2961         case PARAM_TYPE_MCID_REQ_IND:
2962           dissect_isup_mcid_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);          
2963           break;
2964         case PARAM_TYPE_MCID_RSP_IND:
2965           dissect_isup_mcid_response_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);         
2966           break;
2967         case PARAM_TYPE_HOP_COUNTER:
2968           dissect_isup_hop_counter_parameter(parameter_tvb, parameter_tree, parameter_item);      
2969           break;
2970         case PARAM_TYPE_TRANSM_MEDIUM_RQUR_PR:
2971           dissect_isup_transmission_medium_requirement_prime_parameter(parameter_tvb, parameter_tree, parameter_item);    
2972           break;
2973         case PARAM_TYPE_LOCATION_NR:
2974           dissect_isup_location_number_parameter(parameter_tvb, parameter_tree, parameter_item);          
2975           break;
2976         case PARAM_TYPE_REDIR_NR_RSTRCT:
2977           dissect_isup_redirection_number_restriction_parameter(parameter_tvb, parameter_tree, parameter_item);   
2978           break;
2979         case PARAM_TYPE_CALL_TRANS_REF:
2980           dissect_isup_call_transfer_reference_parameter(parameter_tvb, parameter_tree, parameter_item);          
2981           break;
2982         case PARAM_TYPE_LOOP_PREV_IND:
2983           dissect_isup_loop_prevention_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);       
2984           break;
2985         case PARAM_TYPE_CALL_TRANS_NR:
2986           dissect_isup_call_transfer_number_parameter(parameter_tvb, parameter_tree, parameter_item);     
2987           break;
2988         case PARAM_TYPE_CCSS:
2989           dissect_isup_ccss_parameter(parameter_tvb, parameter_tree, parameter_item);     
2990           break;
2991         case PARAM_TYPE_FORW_GVNS:
2992           dissect_isup_forward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);     
2993           break;
2994         case PARAM_TYPE_BACKW_GVNS:
2995           dissect_isup_backward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);    
2996           break;
2997         case PARAM_TYPE_REDIRECT_CAPAB:
2998           dissect_isup_redirect_capability_parameter(parameter_tvb, parameter_tree, parameter_item);      
2999           break;
3000         case PARAM_TYPE_NETW_MGMT_CTRL:
3001           dissect_isup_network_management_controls_parameter(parameter_tvb, parameter_tree, parameter_item);      
3002           break;
3003         case PARAM_TYPE_CORRELATION_ID:
3004           dissect_isup_correlation_id_parameter(parameter_tvb, parameter_tree, parameter_item);   
3005           break;
3006         case PARAM_TYPE_SCF_ID:
3007           dissect_isup_scf_id_parameter(parameter_tvb, parameter_tree, parameter_item);   
3008           break;
3009         case PARAM_TYPE_CALL_DIV_TREAT_IND:
3010           dissect_isup_call_diversion_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);      
3011           break;
3012         case PARAM_TYPE_CALLED_IN_NR:
3013           dissect_isup_called_in_number_parameter(parameter_tvb, parameter_tree, parameter_item);         
3014           break;
3015         case PARAM_TYPE_CALL_OFF_TREAT_IND:
3016           dissect_isup_call_offering_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);       
3017           break;
3018         case PARAM_TYPE_CHARGED_PARTY_IDENT:
3019           dissect_isup_charged_party_identification_parameter(parameter_tvb, parameter_tree, parameter_item);     
3020           break;
3021         case PARAM_TYPE_CONF_TREAT_IND:
3022           dissect_isup_conference_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);          
3023           break;
3024         case PARAM_TYPE_DISPLAY_INFO:
3025           dissect_isup_display_information_parameter(parameter_tvb, parameter_tree, parameter_item);      
3026           break;
3027         case PARAM_TYPE_UID_ACTION_IND:
3028           dissect_isup_uid_action_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);    
3029           break;
3030         case PARAM_TYPE_UID_CAPAB_IND:
3031           dissect_isup_uid_capability_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);        
3032           break;
3033         case PARAM_TYPE_REDIRECT_COUNTER:
3034           dissect_isup_redirect_counter_parameter(parameter_tvb, parameter_tree, parameter_item);         
3035           break;
3036         case PARAM_TYPE_COLLECT_CALL_REQ:
3037           dissect_isup_collect_call_request_parameter(parameter_tvb, parameter_tree, parameter_item);     
3038           break;
3039         case PARAM_TYPE_GENERIC_NR:
3040           dissect_isup_generic_number_parameter(parameter_tvb, parameter_tree, parameter_item);   
3041           break;
3042         case PARAM_TYPE_GENERIC_DIGITS:
3043           dissect_isup_generic_digits_parameter(parameter_tvb, parameter_tree, parameter_item);   
3044           break;          
3045         default:
3046           dissect_isup_unknown_parameter(parameter_tvb, parameter_item);
3047           break;
3048         }
3049         offset += MIN(parameter_length, actual_length);
3050       }
3051       
3052     }
3053     else {
3054         /* End of optional parameters is reached */
3055         proto_tree_add_uint_format(isup_tree, hf_isup_message_type, optional_parameters_tvb , offset, PARAMETER_TYPE_LENGTH, parameter_type, "End of optional parameters (%u)", parameter_type);
3056     }
3057   }
3058 }
3059
3060 /* ------------------------------------------------------------------ */
3061 /* Dissectors for all used message types                              */
3062 /* Called by dissect_isup_message(),                                  */ 
3063 /* call parameter dissectors in order of mandatory parameters         */
3064 /* (since not labeled)                                                */
3065 /* ------------------------------------------------------------------
3066   Dissector Message Type Initial address message 
3067  */
3068 gint
3069 dissect_isup_initial_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3070 { proto_item* parameter_item;
3071   proto_tree* parameter_tree;
3072   tvbuff_t *parameter_tvb;
3073   gint offset = 0;
3074   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3075   
3076   /* Do stuff for first mandatory fixed parameter: Nature of Connection Indicators */
3077   parameter_type = PARAM_TYPE_NATURE_OF_CONN_IND;
3078   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3079                                        NATURE_OF_CONNECTION_IND_LENGTH,
3080                                        "Nature of Connection Indicators");
3081   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3082   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"));               
3083   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3084   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(NATURE_OF_CONNECTION_IND_LENGTH, actual_length), NATURE_OF_CONNECTION_IND_LENGTH);
3085   dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3086   offset += NATURE_OF_CONNECTION_IND_LENGTH;
3087
3088   /* Do stuff for 2nd mandatory fixed parameter: Forward Call Indicators */
3089   parameter_type =  PARAM_TYPE_FORW_CALL_IND;
3090   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3091                                        FORWARD_CALL_IND_LENGTH,
3092                                        "Forward Call Indicators");
3093   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3094   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"));               
3095   actual_length = tvb_ensure_length_remaining(message_tvb, offset); 
3096   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FORWARD_CALL_IND_LENGTH, actual_length), FORWARD_CALL_IND_LENGTH );
3097   dissect_isup_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3098   offset +=  FORWARD_CALL_IND_LENGTH;
3099
3100   /* Do stuff for 3nd mandatory fixed parameter: Calling party's category */
3101   parameter_type = PARAM_TYPE_CALLING_PRTY_CATEG;
3102   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3103                                        CALLING_PRTYS_CATEGORY_LENGTH,
3104                                        "Calling Party's category");
3105   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3106   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"));               
3107   actual_length = tvb_ensure_length_remaining(message_tvb, offset); 
3108   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CALLING_PRTYS_CATEGORY_LENGTH, actual_length),CALLING_PRTYS_CATEGORY_LENGTH );
3109   dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item);
3110   offset += CALLING_PRTYS_CATEGORY_LENGTH;
3111
3112   /* Do stuff for 4th mandatory fixed parameter: Transmission medium requirement */
3113   parameter_type = PARAM_TYPE_TRANSM_MEDIUM_REQU;
3114   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3115                                        TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH,
3116                                        "Transmission medium requirement");
3117   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3118   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"));                      
3119   actual_length = tvb_ensure_length_remaining(message_tvb, offset); 
3120   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH, actual_length), TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH);
3121   dissect_isup_transmission_medium_requirement_parameter(parameter_tvb, parameter_tree, parameter_item);
3122   offset += TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH;
3123
3124
3125   /* Do stuff for mandatory variable parameter Called party number */
3126   parameter_type = PARAM_TYPE_CALLED_PARTY_NR;
3127   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3128   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3129
3130   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3131                                        offset +  parameter_pointer,
3132                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3133                                        "Called Party Number");
3134   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3135   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"));       
3136   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);  
3137   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);
3138   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3139   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3140   dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3141   offset += PARAMETER_POINTER_LENGTH;
3142
3143   return offset;
3144 }
3145 /* ------------------------------------------------------------------
3146   Dissector Message Type subsequent address message 
3147  */
3148 gint dissect_isup_subsequent_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3149 { proto_item* parameter_item;
3150   proto_tree* parameter_tree;
3151   tvbuff_t *parameter_tvb;
3152   gint offset = 0;
3153   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3154   
3155   /* Do stuff for mandatory variable parameter Subsequent number */
3156   parameter_type = PARAM_TYPE_SUBSQT_NR;
3157
3158   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3159   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3160
3161   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3162                                        offset +  parameter_pointer,
3163                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3164                                        "Subsequent Number");
3165   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3166   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"));       
3167   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);  
3168   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);
3169   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3170   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3171   dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3172   offset += PARAMETER_POINTER_LENGTH;
3173
3174   return offset;
3175 }
3176
3177 /* ------------------------------------------------------------------
3178   Dissector Message Type Information request message 
3179  */
3180 gint
3181 dissect_isup_information_request_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3182 { proto_item* parameter_item;
3183   proto_tree* parameter_tree;
3184   tvbuff_t *parameter_tvb;
3185   gint offset = 0;
3186   gint parameter_type, actual_length;
3187  
3188   /* Do stuff for first mandatory fixed parameter: Information request indicators*/ 
3189   parameter_type = PARAM_TYPE_INFO_REQ_IND;
3190   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3191                                        INFO_REQUEST_IND_LENGTH,
3192                                        "Information request indicators");
3193   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3194   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"));               
3195   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3196   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(INFO_REQUEST_IND_LENGTH, actual_length), INFO_REQUEST_IND_LENGTH);
3197   dissect_isup_information_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3198   offset += INFO_REQUEST_IND_LENGTH;
3199   return offset;
3200 }
3201 /* ------------------------------------------------------------------
3202   Dissector Message Type Information  
3203  */
3204 gint
3205 dissect_isup_information_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3206 { proto_item* parameter_item;
3207   proto_tree* parameter_tree;
3208   tvbuff_t *parameter_tvb;
3209   gint offset = 0;
3210   gint parameter_type, actual_length;
3211  
3212   /* Do stuff for first mandatory fixed parameter: Information  indicators*/ 
3213   parameter_type = PARAM_TYPE_INFO_IND;
3214   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3215                                        INFO_IND_LENGTH,
3216                                        "Information indicators");
3217   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3218   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"));               
3219   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3220   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(INFO_IND_LENGTH, actual_length), INFO_IND_LENGTH);
3221   dissect_isup_information_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3222   offset += INFO_IND_LENGTH;
3223   return offset;
3224 }
3225 /* ------------------------------------------------------------------
3226   Dissector Message Type Continuity 
3227  */
3228 gint
3229 dissect_isup_continuity_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3230 { proto_item* parameter_item;
3231   proto_tree* parameter_tree;
3232   tvbuff_t *parameter_tvb;
3233   gint offset = 0;
3234   gint parameter_type, actual_length;
3235  
3236   /* Do stuff for first mandatory fixed parameter: Continuity indicators*/ 
3237   parameter_type = PARAM_TYPE_CONTINUITY_IND;
3238   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3239                                        CONTINUITY_IND_LENGTH,
3240                                        "Continuity indicators");
3241   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3242   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"));               
3243   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3244   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CONTINUITY_IND_LENGTH, actual_length), CONTINUITY_IND_LENGTH);
3245   dissect_isup_continuity_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3246   offset += CONTINUITY_IND_LENGTH;
3247   return offset;
3248 }
3249 /* ------------------------------------------------------------------
3250   Dissector Message Type Address complete
3251  */
3252 gint
3253 dissect_isup_address_complete_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3254 { proto_item* parameter_item;
3255   proto_tree* parameter_tree;
3256   tvbuff_t *parameter_tvb;
3257   gint offset = 0;
3258   gint parameter_type, actual_length;
3259  
3260   /* Do stuff for first mandatory fixed parameter: backward call indicators*/ 
3261   parameter_type = PARAM_TYPE_BACKW_CALL_IND;
3262   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3263                                        BACKWARD_CALL_IND_LENGTH,
3264                                        "Backward Call Indicators");
3265   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3266   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"));               
3267   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3268   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(BACKWARD_CALL_IND_LENGTH, actual_length), BACKWARD_CALL_IND_LENGTH);
3269   dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3270   offset += BACKWARD_CALL_IND_LENGTH;
3271   return offset;
3272 }
3273 /* ------------------------------------------------------------------
3274   Dissector Message Type Connect
3275  */
3276 gint
3277 dissect_isup_connect_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3278 { proto_item* parameter_item;
3279   proto_tree* parameter_tree;
3280   tvbuff_t *parameter_tvb;
3281   gint offset = 0;
3282   gint parameter_type, actual_length;
3283  
3284   /* Do stuff for first mandatory fixed parameter: backward call indicators*/ 
3285   parameter_type = PARAM_TYPE_BACKW_CALL_IND;
3286   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3287                                        BACKWARD_CALL_IND_LENGTH,
3288                                        "Backward Call Indicators");
3289   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3290   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"));               
3291   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3292   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(BACKWARD_CALL_IND_LENGTH, actual_length), BACKWARD_CALL_IND_LENGTH);
3293   dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3294   offset += BACKWARD_CALL_IND_LENGTH;
3295   return offset;
3296 }
3297 /* ------------------------------------------------------------------
3298   Dissector Message Type release message 
3299  */
3300 gint 
3301 dissect_isup_release_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3302 { proto_item* parameter_item;
3303   proto_tree* parameter_tree;
3304   tvbuff_t *parameter_tvb;
3305   gint offset = 0;
3306   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3307   
3308   /* Do stuff for mandatory variable parameter Cause indicators */
3309   parameter_type =  PARAM_TYPE_CAUSE_INDICATORS;
3310
3311   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3312   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3313
3314   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3315                                        offset +  parameter_pointer,
3316                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3317                                        "Cause indicators, see Q.850");
3318   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3319   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"));       
3320   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);  
3321   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);
3322   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3323   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3324   dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3325   offset += PARAMETER_POINTER_LENGTH;
3326
3327   return offset;
3328 }
3329 /* ------------------------------------------------------------------
3330   Dissector Message Type Resume/Suspend
3331  */
3332 gint
3333 dissect_isup_suspend_resume_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3334 { proto_item* parameter_item;
3335   proto_tree* parameter_tree;
3336   tvbuff_t *parameter_tvb;
3337   gint offset = 0;
3338   gint parameter_type, actual_length;
3339  
3340   /* Do stuff for first mandatory fixed parameter: backward call indicators*/ 
3341   parameter_type = PARAM_TYPE_SUSP_RESUME_IND;
3342   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3343                                        SUSPEND_RESUME_IND_LENGTH,
3344                                        "Suspend/Resume indicator");
3345   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3346   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"));               
3347   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3348   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(SUSPEND_RESUME_IND_LENGTH, actual_length), SUSPEND_RESUME_IND_LENGTH);
3349   dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3350   offset += SUSPEND_RESUME_IND_LENGTH;
3351   return offset;
3352 }
3353 /* ------------------------------------------------------------------
3354   Dissector Message Type Circuit group reset/query message
3355  */
3356 gint 
3357 dissect_isup_circuit_group_reset_query_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3358 { proto_item* parameter_item;
3359   proto_tree* parameter_tree;
3360   tvbuff_t *parameter_tvb;
3361   gint offset = 0;
3362   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3363   
3364   /* Do stuff for mandatory variable parameter range and status*/
3365   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3366
3367   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3368   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3369
3370   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3371                                        offset +  parameter_pointer,
3372                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3373                                        "Range and status");
3374   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3375   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"));       
3376   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);  
3377   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);
3378   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3379   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3380   dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3381   offset += PARAMETER_POINTER_LENGTH;
3382
3383   return offset;
3384 }
3385 /* ------------------------------------------------------------------
3386   Dissector Message Type Circuit group blocking/blocking ack/unblocking/unblocking ack messages 
3387  */
3388 gint 
3389 dissect_isup_circuit_group_blocking_messages(tvbuff_t *message_tvb, proto_tree *isup_tree)
3390 { proto_item* parameter_item;
3391   proto_tree* parameter_tree;
3392   tvbuff_t *parameter_tvb;
3393   gint offset = 0;
3394   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3395
3396    /* Do stuff for first mandatory fixed parameter: circuit group supervision message type*/ 
3397   parameter_type = PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE;
3398   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3399                                        CIRC_GRP_SV_MSG_TYPE_LENGTH,
3400                                        "Circuit group supervision message type");
3401   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3402   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"));               
3403   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3404   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CIRC_GRP_SV_MSG_TYPE_LENGTH, actual_length), CIRC_GRP_SV_MSG_TYPE_LENGTH);
3405   dissect_isup_circuit_group_supervision_message_type_parameter(parameter_tvb, parameter_tree, parameter_item);
3406   offset += CIRC_GRP_SV_MSG_TYPE_LENGTH;
3407   
3408   /* Do stuff for mandatory variable parameter range and status*/
3409   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3410
3411   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3412   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3413
3414   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3415                                        offset +  parameter_pointer,
3416                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3417                                        "Facility indicator");
3418   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3419   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"));       
3420   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);  
3421   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);
3422   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3423   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3424   dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
3425   offset += PARAMETER_POINTER_LENGTH;
3426
3427   return offset;
3428 }
3429
3430 /* ------------------------------------------------------------------
3431   Dissector Message Type Facility request/accepted
3432  */
3433 gint
3434 dissect_isup_facility_request_accepted_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3435 { proto_item* parameter_item;
3436   proto_tree* parameter_tree;
3437   tvbuff_t *parameter_tvb;
3438   gint offset = 0;
3439   gint parameter_type, actual_length;
3440  
3441   /* Do stuff for first mandatory fixed parameter: facility indicators*/ 
3442   parameter_type = PARAM_TYPE_FACILITY_IND;
3443   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3444                                        FACILITY_IND_LENGTH,
3445                                        "Facility indicator");
3446   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3447   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"));               
3448   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3449   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FACILITY_IND_LENGTH, actual_length), FACILITY_IND_LENGTH);
3450   dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
3451   offset += FACILITY_IND_LENGTH;
3452   return offset;
3453 }
3454 /* ------------------------------------------------------------------
3455   Dissector Message Type Facility reject
3456  */
3457 gint
3458 dissect_isup_facility_reject_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3459 { proto_item* parameter_item;
3460   proto_tree* parameter_tree;
3461   tvbuff_t *parameter_tvb;
3462   gint offset = 0;
3463   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3464  
3465   /* Do stuff for first mandatory fixed parameter: facility indicators*/ 
3466   parameter_type = PARAM_TYPE_FACILITY_IND;
3467   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3468                                        FACILITY_IND_LENGTH,
3469                                        "Facility indicator");
3470   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3471   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"));               
3472   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3473   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FACILITY_IND_LENGTH, actual_length), FACILITY_IND_LENGTH);
3474   dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
3475   offset += FACILITY_IND_LENGTH;
3476
3477   /* Do stuff for mandatory variable parameter Cause indicators */
3478   parameter_type =  PARAM_TYPE_CAUSE_INDICATORS;
3479
3480   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3481   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3482
3483   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3484                                        offset +  parameter_pointer,
3485                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3486                                        "Cause indicators, see Q.850");
3487   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3488   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"));       
3489   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);  
3490   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);
3491   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3492   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3493   dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3494   offset += PARAMETER_POINTER_LENGTH;
3495
3496   return offset;
3497 }
3498 /* ------------------------------------------------------------------
3499   Dissector Message Type Circuit group reset acknowledgement message 
3500  */
3501 gint 
3502 dissect_isup_circuit_group_reset_acknowledgement_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3503 { proto_item* parameter_item;
3504   proto_tree* parameter_tree;
3505   tvbuff_t *parameter_tvb;
3506   gint offset = 0;
3507   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3508   
3509   /* Do stuff for mandatory variable parameter range and status*/
3510   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3511
3512   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3513   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3514
3515   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3516                                        offset +  parameter_pointer,
3517                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3518                                        "Range and status");
3519   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3520   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"));       
3521   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);  
3522   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);
3523   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3524   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3525   dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3526   offset += PARAMETER_POINTER_LENGTH;
3527
3528   return offset;
3529 }
3530 /* ------------------------------------------------------------------
3531   Dissector Message Type Circuit group query response message
3532  */
3533 gint 
3534 dissect_isup_circuit_group_query_response_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3535 { proto_item* parameter_item;
3536   proto_tree* parameter_tree;
3537   tvbuff_t *parameter_tvb;
3538   gint offset = 0;
3539   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3540   
3541   /* Do stuff for 1. mandatory variable parameter range and status*/
3542   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3543
3544   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3545   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3546
3547   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3548                                        offset +  parameter_pointer,
3549                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3550                                        "Range and status");
3551   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3552   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"));       
3553   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);  
3554   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);
3555   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3556   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3557   dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3558   offset += PARAMETER_POINTER_LENGTH;
3559
3560   /* Do stuff for 2. mandatory variable parameter Circuit state indicator*/
3561   parameter_type = PARAM_TYPE_CIRC_STATE_IND;
3562
3563   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3564   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3565
3566   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3567                                        offset +  parameter_pointer,
3568                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3569                                        "Circuit state indicator (national use)");
3570   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3571   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"));       
3572   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);  
3573   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);
3574   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3575   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3576   dissect_isup_circuit_state_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
3577   offset += PARAMETER_POINTER_LENGTH;
3578
3579   return offset;
3580 }
3581 /* ------------------------------------------------------------------
3582   Dissector Message Type Call Progress
3583 */
3584 gint
3585 dissect_isup_call_progress_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3586 { proto_item* parameter_item;
3587   proto_tree* parameter_tree;
3588   tvbuff_t *parameter_tvb;
3589   gint offset = 0;
3590   gint parameter_type, actual_length;
3591  
3592   /* Do stuff for first mandatory fixed parameter: Event information*/ 
3593   parameter_type = PARAM_TYPE_EVENT_INFO;
3594   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3595                                        EVENT_INFO_LENGTH,
3596                                        "Event information");
3597   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3598   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"));               
3599   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3600   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(EVENT_INFO_LENGTH, actual_length), EVENT_INFO_LENGTH);
3601   dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3602   offset += EVENT_INFO_LENGTH;
3603   return offset;
3604 }
3605 /* ------------------------------------------------------------------
3606   Dissector Message Type User-to-User information
3607  */
3608 gint 
3609 dissect_isup_user_to_user_information_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3610 { proto_item* parameter_item;
3611   proto_tree* parameter_tree;
3612   tvbuff_t *parameter_tvb;
3613   gint offset = 0;
3614   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3615   
3616   /* Do stuff for mandatory variable parameter User-to-user information*/
3617   parameter_type =  PARAM_TYPE_USER_TO_USER_INFO;
3618
3619   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3620   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3621
3622   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3623                                        offset +  parameter_pointer,
3624                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3625                                        "User-to-user information, see Q.931");
3626   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3627   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"));       
3628   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);  
3629   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);
3630   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3631   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3632   dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3633   offset += PARAMETER_POINTER_LENGTH;
3634
3635   return offset;
3636 }
3637 /* ------------------------------------------------------------------
3638   Dissector Message Type Confusion  
3639  */
3640 gint 
3641 dissect_isup_confusion_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3642 { proto_item* parameter_item;
3643   proto_tree* parameter_tree;
3644   tvbuff_t *parameter_tvb;
3645   gint offset = 0;
3646   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3647   
3648   /* Do stuff for mandatory variable parameter Cause indicators */
3649   parameter_type =  PARAM_TYPE_CAUSE_INDICATORS;
3650
3651   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3652   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3653
3654   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3655                                        offset +  parameter_pointer,
3656                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3657                                        "Cause indicators, see Q.850");
3658   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3659   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"));       
3660   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);  
3661   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);
3662   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3663   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3664   dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3665   offset += PARAMETER_POINTER_LENGTH;
3666
3667   return offset;
3668 }
3669 /* ------------------------------------------------------------------ */
3670 static void
3671 dissect_isup_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup_tree)
3672
3673   tvbuff_t *parameter_tvb;
3674   tvbuff_t *optional_parameter_tvb;
3675   proto_item* pass_along_item;
3676   proto_tree* pass_along_tree;
3677   gint offset, bufferlength;
3678   guint8 message_type, opt_parameter_pointer;
3679   gint opt_part_possible = FALSE; /* default setting - for message types allowing optional 
3680                                      params explicitely set to TRUE in case statement */
3681   offset = 0;
3682   
3683   /* Extract message type field */
3684   message_type = tvb_get_guint8(message_tvb,0); 
3685
3686   if (check_col(pinfo->cinfo, COL_INFO)){
3687     col_append_str(pinfo->cinfo, COL_INFO, val_to_str(message_type, isup_message_type_value, "reserved"));
3688     col_append_str(pinfo->cinfo, COL_INFO, " ");
3689   }
3690  
3691    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);
3692    offset +=  MESSAGE_TYPE_LENGTH;
3693
3694    bufferlength = tvb_ensure_length_remaining(message_tvb, offset);
3695    parameter_tvb = tvb_new_subset(message_tvb, offset, bufferlength, bufferlength);
3696
3697    /* distinguish between message types:*/
3698    switch (message_type) {
3699      case MESSAGE_TYPE_INITIAL_ADDR:
3700        offset += dissect_isup_initial_address_message(parameter_tvb, isup_tree);
3701        opt_part_possible = TRUE;
3702       break;
3703     case MESSAGE_TYPE_SUBSEQ_ADDR:
3704        offset += dissect_isup_subsequent_address_message(parameter_tvb, isup_tree);
3705        opt_part_possible = TRUE;
3706       break;
3707     case MESSAGE_TYPE_INFO_REQ:
3708        offset += dissect_isup_information_request_message(parameter_tvb, isup_tree);
3709        opt_part_possible = TRUE;
3710       break;
3711     case MESSAGE_TYPE_INFO:
3712        offset += dissect_isup_information_message(parameter_tvb, isup_tree);
3713        opt_part_possible = TRUE;
3714       break;
3715     case MESSAGE_TYPE_CONTINUITY:
3716        offset += dissect_isup_continuity_message(parameter_tvb, isup_tree);
3717       break;
3718     case MESSAGE_TYPE_ADDR_CMPL:
3719        offset += dissect_isup_address_complete_message(parameter_tvb, isup_tree);
3720        opt_part_possible = TRUE;
3721       break;
3722     case MESSAGE_TYPE_CONNECT:
3723        offset += dissect_isup_connect_message(parameter_tvb, isup_tree);
3724        opt_part_possible = TRUE;
3725       break;
3726     case MESSAGE_TYPE_FORW_TRANS:
3727       /* no dissector necessary since no mandatory parameters included */
3728        opt_part_possible = TRUE;
3729       break;
3730     case MESSAGE_TYPE_ANSWER:
3731       /* no dissector necessary since no mandatory parameters included */
3732        opt_part_possible = TRUE;
3733       break;
3734     case MESSAGE_TYPE_RELEASE:
3735        offset += dissect_isup_release_message(parameter_tvb, isup_tree);
3736        opt_part_possible = TRUE;
3737       break;
3738     case MESSAGE_TYPE_SUSPEND:
3739        offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
3740        opt_part_possible = TRUE;
3741       break;
3742     case MESSAGE_TYPE_RESUME:
3743        offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
3744        opt_part_possible = TRUE;
3745       break;
3746     case MESSAGE_TYPE_REL_CMPL:
3747       /* no dissector necessary since no mandatory parameters included */
3748        opt_part_possible = TRUE;
3749       break;
3750     case MESSAGE_TYPE_CONT_CHECK_REQ:
3751       /* no dissector necessary since no mandatory parameters included */
3752       break;
3753     case MESSAGE_TYPE_RESET_CIRCUIT:
3754       /* no dissector necessary since no mandatory parameters included */
3755       break;
3756     case MESSAGE_TYPE_BLOCKING:
3757       /* no dissector necessary since no mandatory parameters included */
3758       break;
3759     case MESSAGE_TYPE_UNBLOCKING:
3760       /* no dissector necessary since no mandatory parameters included */
3761       break;
3762     case MESSAGE_TYPE_BLOCK_ACK:
3763       /* no dissector necessary since no mandatory parameters included */
3764       break;
3765     case MESSAGE_TYPE_UNBLOCK_ACK:
3766       /* no dissector necessary since no mandatory parameters included */
3767       break;
3768     case MESSAGE_TYPE_CIRC_GRP_RST:
3769        offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
3770       break;
3771     case MESSAGE_TYPE_CIRC_GRP_BLCK:
3772        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3773       break;
3774     case MESSAGE_TYPE_CIRC_GRP_UNBL:
3775        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3776       break;
3777     case MESSAGE_TYPE_CIRC_GRP_BL_ACK:
3778        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3779       break;
3780     case MESSAGE_TYPE_CIRC_GRP_UNBL_ACK:
3781        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3782       break;
3783     case MESSAGE_TYPE_FACILITY_REQ:
3784        offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
3785        opt_part_possible = TRUE;
3786       break;
3787     case MESSAGE_TYPE_FACILITY_ACC:
3788        offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
3789        opt_part_possible = TRUE;
3790       break;
3791     case MESSAGE_TYPE_FACILITY_REJ:
3792        offset += dissect_isup_facility_reject_message(parameter_tvb, isup_tree);
3793        opt_part_possible = TRUE;
3794       break;
3795     case MESSAGE_TYPE_LOOP_BACK_ACK:
3796       /* no dissector necessary since no mandatory parameters included */
3797       break;
3798     case MESSAGE_TYPE_PASS_ALONG:
3799       /* call dissect_isup_message recursively */
3800       { guint8 pa_message_type;
3801         pa_message_type = tvb_get_guint8(parameter_tvb, 0);
3802         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, "reserved"), pa_message_type);
3803         pass_along_tree = proto_item_add_subtree(pass_along_item, ett_isup_pass_along_message);
3804         dissect_isup_message(parameter_tvb, pinfo, pass_along_tree);
3805         break;
3806       }
3807     case MESSAGE_TYPE_CIRC_GRP_RST_ACK:
3808        offset += dissect_isup_circuit_group_reset_acknowledgement_message(parameter_tvb, isup_tree);
3809       break;
3810     case MESSAGE_TYPE_CIRC_GRP_QRY:
3811        offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
3812       break;
3813     case MESSAGE_TYPE_CIRC_GRP_QRY_RSP:
3814        offset += dissect_isup_circuit_group_query_response_message(parameter_tvb, isup_tree);
3815       break;
3816     case MESSAGE_TYPE_CALL_PROGRSS:
3817        offset += dissect_isup_call_progress_message(parameter_tvb, isup_tree);
3818        opt_part_possible = TRUE;
3819       break;
3820     case MESSAGE_TYPE_USER2USER_INFO:
3821       offset += dissect_isup_user_to_user_information_message(parameter_tvb, isup_tree);
3822       opt_part_possible = TRUE;
3823       break;
3824     case MESSAGE_TYPE_UNEQUIPPED_CIC:
3825       /* no dissector necessary since no mandatory parameters included */
3826       break;
3827     case MESSAGE_TYPE_CONFUSION:
3828       offset += dissect_isup_confusion_message(parameter_tvb, isup_tree);
3829        opt_part_possible = TRUE;
3830       break;
3831     case MESSAGE_TYPE_OVERLOAD:
3832       /* no dissector necessary since no mandatory parameters included */
3833       break;
3834     case MESSAGE_TYPE_CHARGE_INFO:
3835       /* do nothing since format is a national matter */
3836       proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Format is a national matter"); 
3837       break;
3838     case MESSAGE_TYPE_NETW_RESRC_MGMT:
3839       /* no dissector necessary since no mandatory parameters included */
3840        opt_part_possible = TRUE;
3841       break;
3842     case MESSAGE_TYPE_FACILITY:
3843       /* no dissector necessary since no mandatory parameters included */
3844        opt_part_possible = TRUE;
3845       break;
3846     case MESSAGE_TYPE_USER_PART_TEST:
3847       /* no dissector necessary since no mandatory parameters included */
3848        opt_part_possible = TRUE;
3849       break;
3850     case MESSAGE_TYPE_USER_PART_AVAIL:
3851       /* no dissector necessary since no mandatory parameters included */
3852        opt_part_possible = TRUE;
3853       break;
3854     case MESSAGE_TYPE_IDENT_REQ:
3855       /* no dissector necessary since no mandatory parameters included */
3856        opt_part_possible = TRUE;
3857       break;
3858     case MESSAGE_TYPE_IDENT_RSP:
3859       /* no dissector necessary since no mandatory parameters included */
3860        opt_part_possible = TRUE;
3861       break;
3862     case MESSAGE_TYPE_SEGMENTATION:
3863       /* no dissector necessary since no mandatory parameters included */
3864        opt_part_possible = TRUE;
3865       break;
3866     case MESSAGE_TYPE_LOOP_PREVENTION:
3867       /* no dissector necessary since no mandatory parameters included */
3868        opt_part_possible = TRUE;
3869       break;
3870     default:
3871       proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Unknown Message type (possibly reserved/used in former ISUP version)");
3872       break;
3873   }
3874    
3875    /* extract pointer to start of optional part (if any) */
3876    if (opt_part_possible == TRUE){
3877      opt_parameter_pointer = tvb_get_guint8(message_tvb, offset);
3878      if (opt_parameter_pointer > 0){
3879        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);  
3880        offset += opt_parameter_pointer;
3881        optional_parameter_tvb = tvb_new_subset(message_tvb, offset, -1, -1 );
3882        dissect_isup_optional_parameter(optional_parameter_tvb, isup_tree);
3883      }
3884      else
3885        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);  
3886    }
3887    else if (message_type !=MESSAGE_TYPE_CHARGE_INFO)
3888      proto_tree_add_text(isup_tree, message_tvb, 0, 0, "No optional parameters are possible with this message type");  
3889     
3890 }
3891  
3892 /* ------------------------------------------------------------------ */
3893 static void
3894 dissect_isup(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3895 {
3896
3897 /* Set up structures needed to add the protocol subtree and manage it */
3898         proto_item *ti;
3899         proto_tree *isup_tree;
3900         tvbuff_t *message_tvb;
3901         guint16 cic; 
3902
3903 /* Make entries in Protocol column and Info column on summary display */
3904         if (check_col(pinfo->cinfo, COL_PROTOCOL)) 
3905                 col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISUP");
3906
3907         if (check_col(pinfo->cinfo, COL_INFO)) 
3908                 col_add_str(pinfo->cinfo, COL_INFO, "ISUP message: ");
3909
3910 /* In the interest of speed, if "tree" is NULL, don't do any work not
3911    necessary to generate protocol tree items. */
3912         if (tree) {
3913                 ti = proto_tree_add_item(tree, proto_isup, tvb, 0, -1, FALSE);
3914                 isup_tree = proto_item_add_subtree(ti, ett_isup);
3915
3916                 /* dissect CIC in main dissector since pass-along message type carrying complete IUSP message w/o CIC needs 
3917                    recursive message dissector call */
3918                 cic =          tvb_get_letohs(tvb, CIC_OFFSET) & 0x0FFF; /*since upper 4 bits spare */ 
3919                 
3920                 proto_tree_add_uint_format(isup_tree, hf_isup_cic, tvb, CIC_OFFSET, CIC_LENGTH, cic, "CIC: %u", cic);  
3921
3922                 message_tvb = tvb_new_subset(tvb, CIC_LENGTH, -1, -1);
3923                 dissect_isup_message(message_tvb, pinfo, isup_tree);
3924         }
3925 }
3926
3927
3928 /*---------------------------------------------------------------------*/
3929 /* Register the protocol with Ethereal */
3930 void
3931 proto_register_isup(void)
3932 {                 
3933 /* Setup list of header fields  See Section 1.6.1 for details*/
3934         static hf_register_info hf[] = {
3935                 { &hf_isup_cic,
3936                         { "CIC",           "isup.cic",
3937                         FT_UINT16, BASE_HEX, NULL, 0xFF0F,          
3938                           "", HFILL }}, 
3939
3940                 { &hf_isup_message_type,
3941                         { "Message Type",  "isup.message_type",
3942                         FT_UINT8, BASE_DEC, NULL, 0x0,          
3943                         "", HFILL }},
3944                         
3945                 { &hf_isup_parameter_type,
3946                         { "Parameter Type",  "isup.parameter_type",
3947                         FT_UINT8, BASE_DEC, NULL, 0x0,
3948                         "", HFILL }},
3949                         
3950                 { &hf_isup_parameter_length,
3951                         { "Parameter Length",  "isup.parameter_length",
3952                         FT_UINT8, BASE_DEC, NULL, 0x0,
3953                         "", HFILL }},
3954                         
3955                 { &hf_isup_mandatory_variable_parameter_pointer,
3956                         { "Pointer to Parameter",  "isup.mandatory_variable_parameter_pointer",
3957                         FT_UINT8, BASE_DEC, NULL, 0x0,
3958                         "", HFILL }},
3959
3960                 { &hf_isup_pointer_to_start_of_optional_part,
3961                         { "Pointer to optional parameter part",  "isup.optional_parameter_part_pointer",
3962                         FT_UINT8, BASE_DEC, NULL, 0x0,
3963                         "", HFILL }},
3964
3965                 { &hf_isup_satellite_indicator,
3966                         { "Satellite Indicator",  "isup.satellite_indicator",
3967                         FT_UINT8, BASE_HEX, VALS(isup_satellite_ind_value), BA_8BIT_MASK,
3968                         "", HFILL }},
3969
3970                 { &hf_isup_continuity_check_indicator,
3971                         { "Continuity Check Indicator",  "isup.continuity_check_indicator",
3972                         FT_UINT8, BASE_HEX, VALS(isup_continuity_check_ind_value), DC_8BIT_MASK,
3973                         "", HFILL }},
3974
3975                 { &hf_isup_echo_control_device_indicator,
3976                         { "Echo Control Device Indicator",  "isup.echo_control_device_indicator",
3977                         FT_BOOLEAN, 8, TFS(&isup_echo_control_device_ind_value),E_8BIT_MASK,
3978                         "", HFILL }},
3979
3980                 { &hf_isup_forw_call_natnl_inatnl_call_indicator,
3981                         { "National/international call indicator",  "isup.forw_call_natnl_inatnl_call_indicator",
3982                         FT_BOOLEAN, 16, TFS(&isup_natnl_inatnl_call_ind_value),A_16BIT_MASK,
3983                         "", HFILL }},
3984
3985                 { &hf_isup_forw_call_end_to_end_method_indicator,
3986                         { "End-to-end method indicator",  "isup.forw_call_end_to_end_method_indicator",
3987                         FT_UINT16, BASE_HEX, VALS(isup_end_to_end_method_ind_value), CB_16BIT_MASK,
3988                         "", HFILL }},
3989
3990                 { &hf_isup_forw_call_interworking_indicator,
3991                         { "Interworking indicator",  "isup.forw_call_interworking_indicator",
3992                         FT_BOOLEAN, 16, TFS(&isup_interworking_ind_value), D_16BIT_MASK,
3993                         "", HFILL }},
3994
3995                 { &hf_isup_forw_call_end_to_end_info_indicator,
3996                         { "End-to-end information indicator",  "isup.forw_call_end_to_end_information_indicator",
3997                         FT_BOOLEAN, 16, TFS(&isup_end_to_end_info_ind_value), E_16BIT_MASK,
3998                         "", HFILL }},
3999
4000                 { &hf_isup_forw_call_isdn_user_part_indicator,
4001                         { "ISDN user part indicator",  "isup.forw_call_isdn_user_part_indicator",
4002                         FT_BOOLEAN, 16, TFS(&isup_ISDN_user_part_ind_value), F_16BIT_MASK,
4003                         "", HFILL }},
4004
4005                 { &hf_isup_forw_call_preferences_indicator,
4006                         { "ISDN user part preference indicator",  "isup.forw_call_preferences_indicator",
4007                         FT_UINT16, BASE_HEX, VALS(isup_preferences_ind_value), HG_16BIT_MASK,
4008                         "", HFILL }},
4009
4010                 { &hf_isup_forw_call_isdn_access_indicator,
4011                         { "ISDN access indicator",  "isup.forw_call_isdn_access_indicator",
4012                         FT_BOOLEAN, 16, TFS(&isup_ISDN_originating_access_ind_value), I_16BIT_MASK,
4013                         "", HFILL }},
4014
4015                 { &hf_isup_forw_call_sccp_method_indicator,
4016                         { "SCCP method indicator",  "isup.forw_call_sccp_method_indicator",
4017                         FT_UINT16, BASE_HEX, VALS(isup_SCCP_method_ind_value), KJ_16BIT_MASK,
4018                         "", HFILL }},
4019                                                         
4020                 { &hf_isup_calling_partys_category,
4021                         { "Calling Party's category",  "isup.calling_partys_category",
4022                         FT_UINT8, BASE_HEX, VALS(isup_calling_partys_category_value), 0x0,
4023                         "", HFILL }},
4024                 
4025                 { &hf_isup_transmission_medium_requirement,
4026                         { "Transmission medium requirement",  "isup.transmission_medium_requirement",
4027                         FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_value), 0x0,
4028                         "", HFILL }},
4029
4030                 { &hf_isup_odd_even_indicator,
4031                         { "Odd/even indicator",  "isup.isdn_odd_even_indicator",
4032                         FT_BOOLEAN, 8, TFS(&isup_odd_even_ind_value), ISUP_ODD_EVEN_MASK,
4033                         "", HFILL }},
4034
4035                 { &hf_isup_called_party_nature_of_address_indicator,
4036                         { "Nature of address indicator",  "isup.called_party_nature_of_address_indicator",
4037                         FT_UINT8, BASE_DEC, VALS(isup_called_party_nature_of_address_ind_value), ISUP_NATURE_OF_ADDRESS_IND_MASK,
4038                         "", HFILL }},
4039                                         
4040                 { &hf_isup_calling_party_nature_of_address_indicator,
4041                         { "Nature of address indicator",  "isup.calling_party_nature_of_address_indicator",
4042                         FT_UINT8, BASE_DEC, VALS(isup_calling_party_nature_of_address_ind_value), ISUP_NATURE_OF_ADDRESS_IND_MASK,
4043                         "", HFILL }},
4044                                         
4045                 { &hf_isup_inn_indicator,
4046                         { "INN indicator",  "isup.inn_indicator",
4047                         FT_BOOLEAN, 8, TFS(&isup_INN_ind_value), ISUP_INN_MASK,
4048                         "", HFILL }},
4049
4050                 { &hf_isup_ni_indicator,
4051                         { "NI indicator",  "isup.ni_indicator",
4052                         FT_BOOLEAN, 8, TFS(&isup_NI_ind_value), ISUP_NI_MASK,
4053                         "", HFILL }},
4054
4055                 { &hf_isup_numbering_plan_indicator,
4056                         { "Numbering plan indicator",  "isup.numbering_plan_indicator",
4057                         FT_UINT8, BASE_DEC, VALS(isup_numbering_plan_ind_value), ISUP_NUMBERING_PLAN_IND_MASK,
4058                         "", HFILL }},
4059
4060                 { &hf_isup_address_presentation_restricted_indicator,
4061                         { "Address presentation restricted indicator",  "isup.address_presentation_restricted_indicator",
4062                         FT_UINT8, BASE_DEC, VALS(isup_address_presentation_restricted_ind_value), ISUP_ADDRESS_PRESENTATION_RESTR_IND_MASK,
4063                         "", HFILL }},
4064
4065                 { &hf_isup_screening_indicator,
4066                         { "Screening indicator",  "isup.screening_indicator",
4067                         FT_UINT8, BASE_DEC, VALS(isup_screening_ind_value), ISUP_SCREENING_IND_MASK,
4068                         "", HFILL }},
4069
4070                 { &hf_isup_screening_indicator_enhanced,
4071                         { "Screening indicator",  "isup.screening_indicator_enhanced",
4072                         FT_UINT8, BASE_DEC, VALS(isup_screening_ind_enhanced_value), ISUP_SCREENING_IND_MASK,
4073                         "", HFILL }},
4074
4075                 { &hf_isup_called_party_odd_address_signal_digit,
4076                         { "Address signal digit",  "isup.called_party_odd_address_signal_digit",
4077                         FT_UINT8, BASE_DEC, VALS(isup_called_party_address_digit_value), ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK,
4078                         "", HFILL }},
4079
4080                 { &hf_isup_calling_party_odd_address_signal_digit,
4081                         { "Address signal digit",  "isup.calling_party_odd_address_signal_digit",
4082                         FT_UINT8, BASE_DEC, VALS(isup_calling_party_address_digit_value), ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK,
4083                         "", HFILL }},
4084
4085                 { &hf_isup_called_party_even_address_signal_digit,
4086                         { "Address signal digit",  "isup.called_party_even_address_signal_digit",
4087                         FT_UINT8, BASE_DEC, VALS(isup_called_party_address_digit_value), ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK,
4088                         "", HFILL }},
4089                                         
4090                 { &hf_isup_calling_party_even_address_signal_digit,
4091                         { "Address signal digit",  "isup.calling_party_even_address_signal_digit",
4092                         FT_UINT8, BASE_DEC, VALS(isup_calling_party_address_digit_value), ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK,
4093                         "", HFILL }},
4094                                         
4095                 { &hf_isup_calling_party_address_request_indicator,
4096                         { "Calling party address request indicator",  "isup.calling_party_address_request_indicator",
4097                         FT_BOOLEAN, 16, TFS(&isup_calling_party_address_request_ind_value), A_16BIT_MASK,
4098                         "", HFILL }},
4099                                         
4100                 { &hf_isup_info_req_holding_indicator,
4101                         { "Holding indicator",  "isup.info_req_holding_indicator",
4102                         FT_BOOLEAN, 16, TFS(&isup_holding_ind_value), B_16BIT_MASK,
4103                         "", HFILL }},
4104                                         
4105                 { &hf_isup_calling_partys_category_request_indicator,
4106                         { "Calling party's category request indicator",  "isup.calling_partys_category_request_indicator",
4107                         FT_BOOLEAN, 16, TFS(&isup_calling_partys_category_request_ind_value), D_16BIT_MASK,
4108                         "", HFILL }},
4109                                         
4110                 { &hf_isup_charge_information_request_indicator,
4111                         { "Charge information request indicator",  "isup.charge_information_request_indicator",
4112                         FT_BOOLEAN, 16, TFS(&isup_charge_information_request_ind_value), E_16BIT_MASK,
4113                         "", HFILL }},
4114                                         
4115                 { &hf_isup_malicious_call_identification_request_indicator,
4116                         { "Malicious call identification request indicator (ISUP'88)",  "isup.malicious_call_ident_request_indicator",
4117                         FT_BOOLEAN, 16, TFS(&isup_malicious_call_identification_request_ind_value), H_16BIT_MASK,
4118                         "", HFILL }},
4119
4120                 { &hf_isup_calling_party_address_response_indicator,
4121                         { "Calling party address response indicator",  "isup.calling_party_address_response_indicator",
4122                         FT_UINT16, BASE_HEX, VALS(isup_calling_party_address_response_ind_value), BA_16BIT_MASK,
4123                         "", HFILL }},
4124                                         
4125                 { &hf_isup_hold_provided_indicator,
4126                         { "Hold provided indicator",  "isup.hold_provided_indicator",
4127                         FT_BOOLEAN, 16, TFS(&isup_hold_provided_ind_value), C_16BIT_MASK,
4128                         "", HFILL }},
4129                                         
4130                 { &hf_isup_calling_partys_category_response_indicator,
4131                         { "Calling party's category response indicator",  "isup.calling_partys_category_response_indicator",
4132                         FT_BOOLEAN, 16, TFS(&isup_calling_partys_category_response_ind_value), F_16BIT_MASK,
4133                         "", HFILL }},
4134                                         
4135                 { &hf_isup_charge_information_response_indicator,
4136                         { "Charge information response indicator",  "isup.charge_information_response_indicator",
4137                         FT_BOOLEAN, 16, TFS(&isup_charge_information_response_ind_value), G_16BIT_MASK,
4138                         "", HFILL }},
4139                                         
4140                 { &hf_isup_solicited_indicator,
4141                         { "Solicited indicator",  "isup.solicided_indicator",
4142                         FT_BOOLEAN, 16, TFS(&isup_solicited_information_ind_value), H_16BIT_MASK,
4143                         "", HFILL }},
4144
4145                 { &hf_isup_continuity_indicator,
4146                         { "Continuity indicator",  "isup.continuity_indicator",
4147                         FT_BOOLEAN, 8, TFS(&isup_continuity_ind_value), A_8BIT_MASK,
4148                         "", HFILL }},
4149
4150                 { &hf_isup_backw_call_charge_ind,
4151                         { "Charge indicator",  "isup.charge_indicator",
4152                         FT_UINT16, BASE_HEX, VALS(isup_charge_ind_value), BA_16BIT_MASK,
4153                         "", HFILL }},
4154
4155                 { &hf_isup_backw_call_called_partys_status_ind,
4156                         { "Called party's status indicator",  "isup.called_partys_status_indicator",
4157                         FT_UINT16, BASE_HEX, VALS(isup_called_partys_status_ind_value), DC_16BIT_MASK,
4158                         "", HFILL }},
4159
4160                 { &hf_isup_backw_call_called_partys_category_ind,
4161                         { "Called party's category indicator",  "isup.called_partys_category_indicator",
4162                         FT_UINT16, BASE_HEX, VALS(isup_called_partys_category_ind_value), FE_16BIT_MASK,
4163                         "", HFILL }},
4164
4165                 { &hf_isup_backw_call_end_to_end_method_ind,
4166                         { "End-to-end method indicator",  "isup.backw_call_end_to_end_method_indicator",
4167                         FT_UINT16, BASE_HEX, VALS(isup_end_to_end_method_ind_value), HG_16BIT_MASK,
4168                         "", HFILL }},
4169
4170                 { &hf_isup_backw_call_interworking_ind,
4171                         { "Interworking indicator",  "isup.backw_call_interworking_indicator",
4172                         FT_BOOLEAN, 16, TFS(&isup_interworking_ind_value), I_16BIT_MASK,
4173                         "", HFILL }},
4174
4175                 { &hf_isup_backw_call_end_to_end_info_ind,
4176                         { "End-to-end information indicator",  "isup.backw_call_end_to_end_information_indicator",
4177                         FT_BOOLEAN, 16, TFS(&isup_end_to_end_info_ind_value), J_16BIT_MASK,
4178                         "", HFILL }},
4179
4180                 { &hf_isup_backw_call_isdn_user_part_ind,
4181                         { "ISDN user part indicator",  "isup.backw_call_isdn_user_part_indicator",
4182                         FT_BOOLEAN, 16, TFS(&isup_ISDN_user_part_ind_value), K_16BIT_MASK,
4183                         "", HFILL }},
4184
4185                 { &hf_isup_backw_call_holding_ind,
4186                         { "Holding indicator",  "isup.backw_call_holding_indicator",
4187                         FT_BOOLEAN, 16, TFS(&isup_holding_ind_value), L_16BIT_MASK,
4188                         "", HFILL }},
4189                                         
4190                 { &hf_isup_backw_call_isdn_access_ind,
4191                         { "ISDN access indicator",  "isup.backw_call_isdn_access_indicator",
4192                         FT_BOOLEAN, 16, TFS(&isup_ISDN_terminating_access_ind_value), M_16BIT_MASK,
4193                         "", HFILL }},
4194
4195                 { &hf_isup_backw_call_echo_control_device_ind,
4196                         { "Echo Control Device Indicator",  "isup.backw_call_echo_control_device_indicator",
4197                         FT_BOOLEAN, 16, TFS(&isup_echo_control_device_ind_value), N_16BIT_MASK,
4198                         "", HFILL }},
4199
4200                 { &hf_isup_backw_call_sccp_method_ind,
4201                         { "SCCP method indicator",  "isup.backw_call_sccp_method_indicator",
4202                         FT_UINT16, BASE_HEX, VALS(isup_SCCP_method_ind_value), PO_16BIT_MASK,
4203                         "", HFILL }},
4204                                                         
4205                 { &hf_isup_suspend_resume_indicator,
4206                         { "Suspend/Resume indicator",  "isup.suspend_resume_indicator",
4207                         FT_BOOLEAN, 8, TFS(&isup_suspend_resume_ind_value), A_8BIT_MASK,
4208                         "", HFILL }},
4209                                         
4210                 { &hf_isup_transmission_medium_requirement,
4211                         { "Transmission medium requirement",  "isup.transmission_medium_requirement",
4212                         FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_value), 0x0,
4213                         "", HFILL }},
4214
4215                 { &hf_isup_range_indicator,
4216                         { "Range indicator",  "isup.range_indicator",
4217                           FT_UINT8, BASE_DEC, NULL , 0x0,
4218                           "", HFILL }},
4219
4220                 { &hf_isup_cgs_message_type,
4221                         { "Circuit group supervision message type",  "isup.cgs_message_type",
4222                         FT_UINT8, BASE_DEC, VALS(isup_cgs_message_type_value), BA_8BIT_MASK,
4223                         "", HFILL }},
4224
4225                 { &hf_isup_mtc_blocking_state1,
4226                         { "Maintenance blocking state",  "isup.mtc_blocking_state",
4227                         FT_UINT8, BASE_DEC, VALS(isup_mtc_blocking_state_DC00_value), BA_8BIT_MASK,
4228                         "", HFILL }},
4229
4230                 { &hf_isup_mtc_blocking_state2,
4231                         { "Maintenance blocking state",  "isup.mtc_blocking_state",
4232                         FT_UINT8, BASE_DEC, VALS(isup_mtc_blocking_state_DCnot00_value), BA_8BIT_MASK,
4233                         "", HFILL }},
4234         
4235                 { &hf_isup_call_proc_state,
4236                         { "Call processing state",  "isup.call_processing_state",
4237                         FT_UINT8, BASE_DEC, VALS(isup_call_processing_state_value), DC_8BIT_MASK,
4238                         "", HFILL }},
4239         
4240                 { &hf_isup_hw_blocking_state,
4241                         { "HW blocking state",  "isup.hw_blocking_state",
4242                         FT_UINT8, BASE_DEC, VALS(isup_HW_blocking_state_value), FE_8BIT_MASK,
4243                         "", HFILL }},
4244                                                         
4245                 { &hf_isup_event_ind,
4246                         { "Event indicator",  "isup.event_ind",
4247                           FT_UINT8, 8, NULL, 0x0,
4248                         "", HFILL }},
4249
4250                 { &hf_isup_event_presentation_restricted_ind,
4251                         { "Event presentation restricted indicator",  "isup.event_presentatiation_restr_ind",
4252                         FT_BOOLEAN, 8, TFS(&isup_event_presentation_restricted_ind_value), H_8BIT_MASK,
4253                         "", HFILL }},
4254
4255                 { &hf_isup_cug_call_ind,
4256                         { "Closed user group call indicator",  "isup.clg_call_ind",
4257                         FT_UINT8, BASE_DEC, VALS(isup_CUG_call_ind_value), BA_8BIT_MASK,
4258                         "", HFILL }},
4259
4260                 { &hf_isup_simple_segmentation_ind,
4261                         { "Simple segmentation indicator",  "isup.simple_segmentation_ind",
4262                         FT_BOOLEAN, 8, TFS(&isup_simple_segmentation_ind_value), C_8BIT_MASK,
4263                         "", HFILL }},
4264
4265                 { &hf_isup_connected_line_identity_request_ind,
4266                         { "Connected line identity request indicator",  "isup.connected_line_identity_request_ind",
4267                         FT_BOOLEAN, 8, TFS(&isup_connected_line_identity_request_ind_value), H_8BIT_MASK,
4268                         "", HFILL }},
4269
4270                 { &hf_isup_redirecting_ind,
4271                         { "Redirection indicator",  "isup.redirecting_ind",
4272                         FT_UINT16, BASE_DEC, VALS(isup_redirecting_ind_value), CBA_16BIT_MASK,
4273                         "", HFILL }},
4274
4275                 { &hf_isup_original_redirection_reason,
4276                         { "Original redirection reason",  "isup.original_redirection_reason",
4277                         FT_UINT16, BASE_DEC, VALS(isup_original_redirection_reason_value), HGFE_16BIT_MASK,
4278                         "", HFILL }},
4279
4280                 { &hf_isup_redirection_counter,
4281                         { "Redirection counter",  "isup.redirection_counter",
4282                         FT_UINT16, BASE_DEC, NULL, KJI_16BIT_MASK,
4283                         "", HFILL }},
4284
4285                 { &hf_isup_redirection_reason,
4286                         { "Redirection reason",  "isup.redirection_reason",
4287                         FT_UINT16, BASE_DEC, VALS(isup_redirection_reason_value), PONM_16BIT_MASK,
4288                         "", HFILL }},
4289
4290                 { &hf_isup_type_of_network_identification,
4291                         { "Type of network identification",  "isup.type_of_network_identification",
4292                         FT_UINT8, BASE_DEC, VALS(isup_type_of_network_identification_value), GFE_8BIT_MASK,
4293                         "", HFILL }},
4294
4295                 { &hf_isup_network_identification_plan,
4296                         { "Network identification plan",  "isup.network_identification_plan",
4297                         FT_UINT8, BASE_DEC, VALS(isup_network_identification_plan_value), DCBA_8BIT_MASK,
4298                         "", HFILL }},                                   
4299
4300                 { &hf_isup_map_type,
4301                         { "Map Type",  "isup.map_type",
4302                         FT_UINT8, BASE_DEC, VALS(isup_map_type_value), FEDCBA_8BIT_MASK,
4303                         "", HFILL }},
4304         
4305                 { &hf_isup_automatic_congestion_level,
4306                         { "Automatic congestion level",  "isup.automatic_congestion_level",
4307                         FT_UINT8, BASE_DEC, VALS(isup_auto_congestion_level_value), 0x0,
4308                         "", HFILL }},
4309
4310                 { &hf_isup_inband_information_ind,
4311                         { "In-band information indicator",  "isup.inband_information_ind",
4312                         FT_BOOLEAN, 8, TFS(&isup_inband_information_ind_value), A_8BIT_MASK,
4313                         "", HFILL }},
4314
4315                 { &hf_isup_call_diversion_may_occur_ind,
4316                         { "Call diversion may occur indicator",  "isup.call_diversion_may_occur_ind",
4317                         FT_BOOLEAN, 8, TFS(&isup_call_diversion_may_occur_ind_value), B_8BIT_MASK,
4318                         "", HFILL }},
4319
4320                 { &hf_isup_mlpp_user_ind,
4321                         { "MLPP user indicator",  "isup.mlpp_user",
4322                         FT_BOOLEAN, 8, TFS(&isup_MLPP_user_ind_value), D_8BIT_MASK,
4323                         "", HFILL }},
4324                         
4325                 { &hf_isup_access_delivery_ind,
4326                         { "Access delivery indicator",  "isup.access_delivery_ind",
4327                         FT_BOOLEAN, 8, TFS(&isup_access_delivery_ind_value), A_8BIT_MASK,
4328                         "", HFILL }},
4329                 
4330                 { &hf_isup_transmission_medium_requirement_prime,
4331                         { "Transmission medium requirement prime",  "isup.transmission_medium_requirement_prime",
4332                         FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_prime_value), 0x0,
4333                         "", HFILL }},
4334                 
4335                 { &hf_isup_loop_prevention_response_ind,
4336                         { "Response indicator",  "isup.loop_prevention_response_ind",
4337                         FT_UINT8, BASE_DEC, VALS(isup_loop_prevention_response_ind_value), CB_8BIT_MASK,
4338                         "", HFILL }},
4339                         
4340                 { &hf_isup_temporary_alternative_routing_ind,
4341                         { "Temporary alternative routing indicator",  "isup.temporary_alternative_routing_ind",
4342                         FT_BOOLEAN, 8, TFS(&isup_temporary_alternative_routing_ind_value), A_8BIT_MASK,
4343                         "", HFILL }},
4344                                 
4345                 { &hf_isup_extension_ind,
4346                         { "Extension indicator",  "isup.extension_ind",
4347                         FT_BOOLEAN, 8, TFS(&isup_extension_ind_value), H_8BIT_MASK,
4348                         "", HFILL }},
4349
4350                 { &hf_isup_call_to_be_diverted_ind,
4351                         { "Call to be diverted indicator",  "isup.call_to_be_diverted_ind",
4352                         FT_UINT8, BASE_DEC, VALS(isup_call_to_be_diverted_ind_value), BA_8BIT_MASK,
4353                         "", HFILL }},
4354                         
4355                 { &hf_isup_call_to_be_offered_ind,
4356                         { "Call to be offered indicator",  "isup.call_to_be_offered_ind",
4357                         FT_UINT8, BASE_DEC, VALS(isup_call_to_be_offered_ind_value), BA_8BIT_MASK,
4358                         "", HFILL }},           
4359                         
4360                 { &hf_isup_conference_acceptance_ind,
4361                         { "Conference acceptance indicator",  "isup.conference_acceptance_ind",
4362                         FT_UINT8, BASE_DEC, VALS(isup_conference_acceptance_ind_value), BA_8BIT_MASK,
4363                         "", HFILL }},
4364         };
4365
4366 /* Setup protocol subtree array */
4367         static gint *ett[] = {
4368                 &ett_isup,
4369                 &ett_isup_parameter,
4370                 &ett_isup_address_digits,
4371                 &ett_isup_pass_along_message,
4372                 &ett_isup_circuit_state_ind
4373         };
4374
4375 /* Register the protocol name and description */
4376         proto_isup = proto_register_protocol("ISDN User Part",
4377             "ISUP", "isup");
4378
4379 /* Required function calls to register the header fields and subtrees used */
4380         proto_register_field_array(proto_isup, hf, array_length(hf));
4381         proto_register_subtree_array(ett, array_length(ett));
4382 }
4383
4384
4385 /* ------------------------------------------------------------------ */
4386 /* Register isup with the sub-laying MTP L3 dissector */
4387 void
4388 proto_reg_handoff_isup(void)
4389 {
4390   dissector_handle_t isup_handle;
4391
4392   isup_handle = create_dissector_handle(dissect_isup, proto_isup);
4393   dissector_add("mtp3.service_indicator", MTP3_ISUP_SERVICE_INDICATOR, isup_handle);
4394   dissector_add("m3ua.protocol_data_si", MTP3_ISUP_SERVICE_INDICATOR, isup_handle);
4395 }