Use Ashok's IEEE-float-to-long code as the basis for
[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.11 2002/02/01 04:34:15 gram 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 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 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 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 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 void dissect_isup_called_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1283 {
1284   proto_item *address_digits_item;
1285   proto_tree *address_digits_tree;
1286   guint8 indicators1, indicators2;
1287   guint8 address_digit_pair=0;
1288   gint offset=0; 
1289   gint i=0;
1290   gint length;
1291   char called_number[MAXLENGTH]="";
1292
1293   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1294   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1295   proto_tree_add_uint(parameter_tree, hf_isup_called_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1296   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1297   proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
1298   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1299   offset = 2;
1300
1301   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1302                                             offset, -1,
1303                                             "Called Party Number");
1304   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1305
1306   length = tvb_length_remaining(parameter_tvb, offset);
1307   while(length > 0){
1308     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1309     proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1310     called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1311     if ((length - 1) > 0 ){ 
1312       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1313       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1314     } 
1315     offset++;
1316     length = tvb_length_remaining(parameter_tvb, offset);   
1317   }
1318
1319   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1320       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1321       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1322   }
1323   called_number[i++] = '\0';
1324
1325   proto_item_set_text(address_digits_item, "Called Party Number: %s", called_number);  
1326   proto_item_set_text(parameter_item, "Called Party Number: %s", called_number);
1327   
1328 }
1329 /* ------------------------------------------------------------------
1330   Dissector Parameter  Subsequent number
1331  */
1332 void dissect_isup_subsequent_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1333 {
1334   proto_item *address_digits_item;
1335   proto_tree *address_digits_tree;
1336   guint8 indicators1;
1337   guint8 address_digit_pair=0;
1338   gint offset=0; 
1339   gint i=0;
1340   gint length;
1341   char called_number[MAXLENGTH]="";
1342
1343   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1344   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1345   offset = 1;
1346
1347   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1348                                             offset, -1,
1349                                             "Subsequent Number");
1350   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1351
1352   length = tvb_length_remaining(parameter_tvb, offset);
1353   while(length > 0){
1354     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1355     proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1356     called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1357     if ((length - 1) > 0 ){ 
1358       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1359       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1360     } 
1361     offset++;
1362     length = tvb_length_remaining(parameter_tvb, offset);   
1363   }
1364
1365   if (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1366       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1367       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1368   }
1369   called_number[i++] = '\0';
1370
1371   proto_item_set_text(address_digits_item, "Subsequent Number: %s", called_number);  
1372   proto_item_set_text(parameter_item, "Subsequent Number: %s", called_number);
1373   
1374 }
1375 /* ------------------------------------------------------------------
1376   Dissector Parameter Information Request Indicators
1377  */
1378 void 
1379 dissect_isup_information_request_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1380
1381   guint16 information_request_indicators;
1382   
1383   information_request_indicators = tvb_get_ntohs(parameter_tvb, 0);
1384   proto_tree_add_boolean(parameter_tree, hf_isup_calling_party_address_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1385   proto_tree_add_boolean(parameter_tree, hf_isup_info_req_holding_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1386   proto_tree_add_boolean(parameter_tree, hf_isup_calling_partys_category_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1387   proto_tree_add_boolean(parameter_tree, hf_isup_charge_information_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1388   proto_tree_add_boolean(parameter_tree, hf_isup_malicious_call_identification_request_indicator, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH,  information_request_indicators);
1389   
1390
1391   proto_item_set_text(parameter_item, "Information request indicators: 0x%x", information_request_indicators);
1392 }
1393 /* ------------------------------------------------------------------
1394   Dissector Parameter Information Indicators
1395  */
1396 void 
1397 dissect_isup_information_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1398
1399   guint16 information_indicators;
1400   
1401   information_indicators = tvb_get_ntohs(parameter_tvb, 0);
1402   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_address_response_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1403   proto_tree_add_boolean(parameter_tree, hf_isup_hold_provided_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1404   proto_tree_add_boolean(parameter_tree, hf_isup_calling_partys_category_response_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1405   proto_tree_add_boolean(parameter_tree, hf_isup_charge_information_response_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1406   proto_tree_add_boolean(parameter_tree, hf_isup_solicited_indicator, parameter_tvb, 0, INFO_IND_LENGTH,  information_indicators);
1407   
1408
1409   proto_item_set_text(parameter_item, "Information indicators: 0x%x", information_indicators);
1410 }
1411 /* ------------------------------------------------------------------
1412   Dissector Parameter Continuity Indicators 
1413  */
1414 void 
1415 dissect_isup_continuity_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1416
1417   guint8 continuity_indicators;
1418   
1419   continuity_indicators = tvb_get_guint8(parameter_tvb, 0);
1420   proto_tree_add_boolean(parameter_tree, hf_isup_continuity_indicator, parameter_tvb, 0, CONTINUITY_IND_LENGTH,  continuity_indicators);
1421
1422   proto_item_set_text(parameter_item, "Continuity indicators: 0x%x", continuity_indicators);
1423 }
1424 /* ------------------------------------------------------------------ 
1425  Dissector Parameter Backward Call Indicators 
1426  */
1427 void 
1428 dissect_isup_backward_call_indicators_parameter(tvbuff_t *parameter_tvb,proto_tree *parameter_tree, proto_item *parameter_item)
1429 {
1430   guint16 backward_call_ind;
1431
1432   backward_call_ind = tvb_get_ntohs(parameter_tvb, 0);
1433   
1434
1435   proto_tree_add_uint(parameter_tree, hf_isup_backw_call_charge_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1436   proto_tree_add_uint(parameter_tree, hf_isup_backw_call_called_partys_status_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1437   proto_tree_add_uint(parameter_tree, hf_isup_backw_call_called_partys_category_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1438   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);
1439   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_interworking_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1440   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);
1441   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_isdn_user_part_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1442   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_holding_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH,  backward_call_ind);
1443   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_isdn_access_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1444   proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_echo_control_device_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1445   proto_tree_add_uint(parameter_tree, hf_isup_backw_call_sccp_method_ind, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
1446  
1447   proto_item_set_text(parameter_item, "Backward Call Indicators: 0x%x", backward_call_ind);  
1448 }
1449 /* ------------------------------------------------------------------
1450   Dissector Parameter Cause Indicators - no detailed dissection since defined in Rec. Q.850
1451  */
1452 void 
1453 dissect_isup_cause_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1454 { guint length = tvb_length(parameter_tvb);
1455   proto_tree_add_text(parameter_item, parameter_tvb,0, length, "Cause indicators (-> Q.850)"); 
1456   proto_item_set_text(parameter_item, "Cause indicators, see Q.850 (%u byte%s length)", length , plurality(length, "", "s"));
1457 }
1458
1459 /* ------------------------------------------------------------------
1460   Dissector Parameter Suspend/Resume Indicators 
1461  */
1462 void 
1463 dissect_isup_suspend_resume_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1464
1465   guint8 indicators;
1466   
1467   indicators = tvb_get_guint8(parameter_tvb, 0);
1468   proto_tree_add_boolean(parameter_tree, hf_isup_suspend_resume_indicator, parameter_tvb, 0, SUSPEND_RESUME_IND_LENGTH,  indicators);
1469
1470   proto_item_set_text(parameter_item, "Suspend/Resume indicator: 0x%x", indicators);
1471 }
1472 /* ------------------------------------------------------------------
1473   Dissector Parameter Range and Status Indicators 
1474  */
1475 void 
1476 dissect_isup_range_and_status_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1477
1478   guint8 range, actual_status_length;
1479
1480   range = tvb_get_guint8(parameter_tvb, 0);
1481   proto_tree_add_uint_format(parameter_tree, hf_isup_range_indicator, parameter_tvb, 0, RANGE_LENGTH, range, "Range: %u", range);
1482   actual_status_length = tvb_length_remaining(parameter_tvb, RANGE_LENGTH);
1483   if (actual_status_length > 0)
1484     proto_tree_add_text(parameter_tree, parameter_tvb , RANGE_LENGTH, actual_status_length, "Status subfield");
1485   else
1486     proto_tree_add_text(parameter_tree, parameter_tvb , 0, 0, "Status subfield is not present with this message type");
1487
1488
1489   proto_item_set_text(parameter_item, "Range (%u) and status", range);
1490 }
1491 /* ------------------------------------------------------------------
1492   Dissector Parameter Circuit group supervision message type
1493  */
1494 void 
1495 dissect_isup_circuit_group_supervision_message_type_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1496
1497   guint8 cgs_message_type;
1498   
1499   cgs_message_type = tvb_get_guint8(parameter_tvb, 0);
1500   proto_tree_add_uint(parameter_tree, hf_isup_cgs_message_type, parameter_tvb, 0, CIRC_GRP_SV_MSG_TYPE_LENGTH, cgs_message_type);
1501
1502   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);
1503 }
1504 /* ------------------------------------------------------------------
1505   Dissector Parameter Facility indicator parameter 
1506  */
1507 void 
1508 dissect_isup_facility_ind_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1509
1510   guint8 indicator;
1511   
1512   indicator = tvb_get_guint8(parameter_tvb, 0);
1513
1514   proto_item_set_text(parameter_item, "Facility indicator: %s (%u)"  ,val_to_str(indicator, isup_facility_ind_value,"spare"), indicator);
1515 }
1516 /* ------------------------------------------------------------------
1517   Dissector Parameter Circuit state indicator 
1518  */
1519 void 
1520 dissect_isup_circuit_state_ind_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1521 {
1522   proto_item *circuit_state_item;
1523   proto_tree *circuit_state_tree;
1524   guint8 circuit_state;
1525   gint offset=0; 
1526   gint i=0;
1527   gint length;
1528
1529   length = tvb_length_remaining(parameter_tvb, offset);
1530   while(length > 0){
1531     circuit_state_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1532                                              offset,
1533                                              tvb_length_remaining(parameter_tvb, offset),
1534                                              "Circuit# CIC+%u state", i);
1535     circuit_state_tree = proto_item_add_subtree(circuit_state_item, ett_isup_circuit_state_ind);
1536     circuit_state = tvb_get_guint8(parameter_tvb, offset);
1537     if ((circuit_state & DC_8BIT_MASK) == 0){ 
1538       proto_tree_add_uint(circuit_state_tree, hf_isup_mtc_blocking_state1, parameter_tvb, offset, 1, circuit_state);
1539       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"));  
1540     } 
1541     else { 
1542       proto_tree_add_uint(circuit_state_tree, hf_isup_mtc_blocking_state2, parameter_tvb, offset, 1, circuit_state);
1543       proto_tree_add_uint(circuit_state_tree, hf_isup_call_proc_state, parameter_tvb, offset, 1, circuit_state);
1544       proto_tree_add_uint(circuit_state_tree, hf_isup_hw_blocking_state, parameter_tvb, offset, 1, circuit_state);
1545       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"));     
1546     } 
1547     offset++;
1548     length = tvb_length_remaining(parameter_tvb, offset);
1549   }
1550   proto_item_set_text(parameter_item, "Circuit state indicator (national use)");
1551 }
1552 /* ------------------------------------------------------------------
1553   Dissector Parameter Event information 
1554  */
1555 void 
1556 dissect_isup_event_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1557
1558   guint8 indicators;
1559   
1560   indicators = tvb_get_guint8(parameter_tvb, 0);
1561   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);
1562   proto_tree_add_boolean(parameter_tree, hf_isup_event_presentation_restricted_ind, parameter_tvb, 0, EVENT_INFO_LENGTH, indicators);
1563
1564   proto_item_set_text(parameter_item,"Event information: %s (%u)", val_to_str(indicators & GFEDCBA_8BIT_MASK, isup_event_ind_value, "spare"),indicators );
1565 }
1566 /* ------------------------------------------------------------------
1567   Dissector Parameter User-to-user information- no detailed dissection since defined in Rec. Q.931
1568  */
1569 void 
1570 dissect_isup_user_to_user_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1571 { guint length = tvb_length(parameter_tvb);
1572   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "User-to-user info (-> Q.931)"); 
1573   proto_item_set_text(parameter_item, "User-to-user information, see Q.931 (%u byte%s length)", length , plurality(length, "", "s"));
1574 }
1575 /* ------------------------------------------------------------------
1576   Dissector Parameter Call Reference 
1577  */
1578 void 
1579 dissect_isup_call_reference_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1580
1581   guint32 call_id;
1582   guint16 spc;
1583   
1584   call_id = tvb_get_ntoh24(parameter_tvb, 0);
1585   spc = tvb_get_letohs(parameter_tvb, CALL_ID_LENGTH) & 0x3FFF; /*since 1st 2 bits spare */
1586   proto_tree_add_text(parameter_item, parameter_tvb, 0, CALL_ID_LENGTH, "Call identity: %u", call_id); 
1587   proto_tree_add_text(parameter_item, parameter_tvb, CALL_ID_LENGTH, SPC_LENGTH, "Signalling Point Code: %u", spc); 
1588
1589   proto_item_set_text(parameter_item, "Call Reference: Call ID = %u, SPC = %u", call_id, spc);
1590 }
1591 /* ------------------------------------------------------------------
1592   Dissector Parameter Access Transport - no detailed dissection since defined in Rec. Q.931
1593  */
1594 void 
1595 dissect_isup_access_transport_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1596 { guint length = tvb_length(parameter_tvb);
1597   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Access transport parameter field (-> Q.931)"); 
1598   proto_item_set_text(parameter_item, "Access transport, see Q.931 (%u byte%s length)", length , plurality(length, "", "s"));
1599 }
1600 /* ------------------------------------------------------------------
1601   Dissector Parameter Optional Forward Call indicators
1602  */
1603 void 
1604 dissect_isup_optional_forward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1605
1606   guint8 indicators;
1607   
1608   indicators = tvb_get_guint8(parameter_tvb, 0);
1609   proto_tree_add_uint(parameter_tree, hf_isup_cug_call_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
1610   proto_tree_add_boolean(parameter_tree, hf_isup_simple_segmentation_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
1611   proto_tree_add_boolean(parameter_tree, hf_isup_connected_line_identity_request_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
1612
1613
1614   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 );
1615 }
1616 /* ------------------------------------------------------------------
1617   Dissector Parameter calling party number
1618  */
1619 void 
1620 dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1621 {
1622   proto_item *address_digits_item;
1623   proto_tree *address_digits_tree;
1624   guint8 indicators1, indicators2;
1625   guint8 address_digit_pair=0;
1626   gint offset=0; 
1627   gint i=0;
1628   gint length;
1629   char calling_number[MAXLENGTH]="";
1630
1631   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1632   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1633   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1634   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1635   proto_tree_add_boolean(parameter_tree, hf_isup_ni_indicator, parameter_tvb, 1, 1, indicators2);
1636   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1637   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
1638   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
1639   offset = 2;
1640
1641   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1642                                             offset, -1,
1643                                             "Calling Party Number");
1644   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1645
1646   length = tvb_length_remaining(parameter_tvb, offset);
1647   while(length > 0){
1648     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1649     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1650     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1651     if ((length - 1) > 0 ){ 
1652       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1653       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1654     } 
1655     offset++;
1656     length = tvb_length_remaining(parameter_tvb, offset);   
1657   }
1658
1659   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1660       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1661       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1662   }
1663   calling_number[i++] = '\0';
1664
1665   proto_item_set_text(address_digits_item, "Calling Party Number: %s", calling_number);  
1666   proto_item_set_text(parameter_item, "Calling Party Number: %s", calling_number);
1667   
1668 }
1669 /* ------------------------------------------------------------------
1670   Dissector Parameter Original called  number
1671  */
1672 void 
1673 dissect_isup_original_called_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1674 {
1675   proto_item *address_digits_item;
1676   proto_tree *address_digits_tree;
1677   guint8 indicators1, indicators2;
1678   guint8 address_digit_pair=0;
1679   gint offset=0; 
1680   gint i=0;
1681   gint length;
1682   char calling_number[MAXLENGTH]="";
1683
1684   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1685   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1686   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1687   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1688   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1689   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
1690   offset = 2;
1691
1692   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1693                                             offset, -1,
1694                                             "Original Called Number");
1695   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1696
1697   length = tvb_length_remaining(parameter_tvb, offset);
1698   while(length > 0){
1699     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1700     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1701     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1702     if ((length - 1) > 0 ){ 
1703       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1704       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1705     } 
1706     offset++;
1707     length = tvb_length_remaining(parameter_tvb, offset);   
1708   }
1709
1710   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1711       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1712       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1713   }
1714   calling_number[i++] = '\0';
1715
1716   proto_item_set_text(address_digits_item, "Original Called Number: %s", calling_number);  
1717   proto_item_set_text(parameter_item, "Original Called Number: %s", calling_number);
1718   
1719 }
1720 /* ------------------------------------------------------------------
1721   Dissector Parameter Redirecting number
1722  */
1723 void 
1724 dissect_isup_redirecting_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1725 {
1726   proto_item *address_digits_item;
1727   proto_tree *address_digits_tree;
1728   guint8 indicators1, indicators2;
1729   guint8 address_digit_pair=0;
1730   gint offset=0; 
1731   gint i=0;
1732   gint length;
1733   char calling_number[MAXLENGTH]="";
1734
1735   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1736   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1737   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1738   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1739   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1740   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
1741   offset = 2;
1742
1743   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1744                                             offset, -1,
1745                                             "Redirecting Number");
1746   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1747
1748   length = tvb_length_remaining(parameter_tvb, offset);
1749   while(length > 0){
1750     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1751     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1752     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1753     if ((length - 1) > 0 ){ 
1754       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1755       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1756     } 
1757     offset++;
1758     length = tvb_length_remaining(parameter_tvb, offset);   
1759   }
1760
1761   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1762       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1763       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1764   }
1765   calling_number[i++] = '\0';
1766
1767   proto_item_set_text(address_digits_item, "Redirecting Number: %s", calling_number);  
1768   proto_item_set_text(parameter_item, "Redirecting Number: %s", calling_number);
1769   
1770 }
1771 /* ------------------------------------------------------------------
1772   Dissector Parameter Redirection number 
1773  */
1774 void dissect_isup_redirection_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1775 {
1776   proto_item *address_digits_item;
1777   proto_tree *address_digits_tree;
1778   guint8 indicators1, indicators2;
1779   guint8 address_digit_pair=0;
1780   gint offset=0; 
1781   gint i=0;
1782   gint length;
1783   char called_number[MAXLENGTH]="";
1784
1785   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1786   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1787   proto_tree_add_uint(parameter_tree, hf_isup_called_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1788   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1789   proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
1790   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1791   offset = 2;
1792
1793   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1794                                             offset, -1,
1795                                             "Redirection Number");
1796   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1797
1798   length = tvb_length_remaining(parameter_tvb, offset);
1799   while(length > 0){
1800     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1801     proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1802     called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1803     if ((length - 1) > 0 ){ 
1804       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1805       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1806     } 
1807     offset++;
1808     length = tvb_length_remaining(parameter_tvb, offset);   
1809   }
1810
1811   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1812       proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1813       called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1814   }
1815   called_number[i++] = '\0';
1816
1817   proto_item_set_text(address_digits_item, "Redirection Number: %s", called_number);  
1818   proto_item_set_text(parameter_item, "Redirection Number: %s", called_number); 
1819 }
1820 /* ------------------------------------------------------------------
1821   Dissector Parameter Connection request 
1822  */
1823 void 
1824 dissect_isup_connection_request_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1825
1826   guint32 local_ref;
1827   guint16 spc;
1828   guint8 protocol_class, credit, offset=0; 
1829   
1830   local_ref = tvb_get_ntoh24(parameter_tvb, 0);
1831   proto_tree_add_text(parameter_item, parameter_tvb, offset, LOCAL_REF_LENGTH, "Local Reference: %u", local_ref); 
1832   offset = LOCAL_REF_LENGTH;
1833   spc = tvb_get_letohs(parameter_tvb,offset) & 0x3FFF; /*since 1st 2 bits spare */
1834   proto_tree_add_text(parameter_item, parameter_tvb, offset, SPC_LENGTH, "Signalling Point Code: %u", spc); 
1835   offset += SPC_LENGTH;
1836   protocol_class = tvb_get_guint8(parameter_tvb, offset);
1837   proto_tree_add_text(parameter_item, parameter_tvb, offset, PROTOCOL_CLASS_LENGTH, "Protocol Class: %u", protocol_class); 
1838   offset += PROTOCOL_CLASS_LENGTH;
1839   credit = tvb_get_guint8(parameter_tvb, offset);
1840   proto_tree_add_text(parameter_item, parameter_tvb, offset, CREDIT_LENGTH, "Credit: %u", credit); 
1841   offset += CREDIT_LENGTH;
1842
1843   proto_item_set_text(parameter_item, "Connection request: Local Reference = %u, SPC = %u, Protocol Class = %u, Credit = %u", local_ref, spc, protocol_class, credit);
1844 }
1845 /* ------------------------------------------------------------------
1846   Dissector Parameter Redirection information
1847  */
1848 void 
1849 dissect_isup_redirection_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1850
1851   if (tvb_length(parameter_tvb) == 2){ 
1852     guint16 indicators;
1853     indicators = tvb_get_ntohs(parameter_tvb, 0);
1854     proto_tree_add_uint(parameter_tree, hf_isup_redirecting_ind, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
1855     proto_tree_add_uint(parameter_tree, hf_isup_original_redirection_reason, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
1856     proto_tree_add_uint(parameter_tree, hf_isup_redirection_counter, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
1857     proto_tree_add_uint(parameter_tree, hf_isup_redirection_reason, parameter_tvb,0 , REDIRECTION_INFO_LENGTH, indicators);
1858     proto_item_set_text(parameter_item, "Redirection Information");
1859   }
1860   else { /* ISUP'88 (blue book) */
1861     guint16 indicators;
1862     indicators = tvb_get_guint8(parameter_tvb, 0) * 0x100; /*since 2nd octet isn't present*/ 
1863     proto_tree_add_uint(parameter_tree, hf_isup_redirecting_ind, parameter_tvb, 0, 1, indicators);
1864     proto_tree_add_uint(parameter_tree, hf_isup_original_redirection_reason, parameter_tvb,0 , 1, indicators);
1865     proto_item_set_text(parameter_item, "Redirection Information (2nd octet not present since ISUP '88)");
1866   }
1867 }
1868 /* ------------------------------------------------------------------
1869   Dissector Parameter Closed user group interlock code
1870  */
1871 void dissect_isup_closed_user_group_interlock_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1872 {
1873   char NI_digits[5]="";
1874   guint8 digit_pair;
1875   guint16 bin_code;
1876
1877   digit_pair = tvb_get_guint8(parameter_tvb, 0);
1878   NI_digits[0] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
1879   NI_digits[1] = number_to_char(digit_pair & DCBA_8BIT_MASK);
1880   digit_pair = tvb_get_guint8(parameter_tvb, 1);
1881   NI_digits[2] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
1882   NI_digits[3] = number_to_char(digit_pair & DCBA_8BIT_MASK);
1883   NI_digits[4] = '\0';
1884   proto_tree_add_text(parameter_item, parameter_tvb, 0, 2, "Network Identity: %s", NI_digits); 
1885   bin_code = tvb_get_ntohs(parameter_tvb, 2);  
1886   proto_tree_add_text(parameter_item, parameter_tvb, 3, 2, "Binary Code: 0x%x", bin_code); 
1887   proto_item_set_text(parameter_item, "Closed user group interlock code: NI = %s, Binary code = 0x%x", NI_digits, bin_code); 
1888 }
1889 /* ------------------------------------------------------------------
1890   Dissector Parameter User service information- no detailed dissection since defined in Rec. Q.931
1891  */
1892 void 
1893 dissect_isup_user_service_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1894 { guint length = tvb_length(parameter_tvb);
1895   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "User service information (-> Q.931)"); 
1896   proto_item_set_text(parameter_item, "User service information, see Q.931 (%u byte%s length)", length , plurality(length, "", "s"));
1897 }
1898 /* ------------------------------------------------------------------
1899   Dissector Parameter Signalling point code 
1900  */
1901 void 
1902 dissect_isup_signalling_point_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1903
1904   guint16 spc;
1905   
1906   spc = tvb_get_letohs(parameter_tvb, 0) & 0x3FFF; /*since 1st 2 bits spare */
1907   proto_tree_add_text(parameter_item, parameter_tvb, 0, SIGNALLING_POINT_CODE_LENGTH, "Signalling Point Code: %u", spc); 
1908
1909   proto_item_set_text(parameter_item, "Signalling point code: %u", spc);
1910 }
1911 /* ------------------------------------------------------------------
1912   Dissector Parameter Connected number
1913  */
1914 void 
1915 dissect_isup_connected_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1916 {
1917   proto_item *address_digits_item;
1918   proto_tree *address_digits_tree;
1919   guint8 indicators1, indicators2;
1920   guint8 address_digit_pair=0;
1921   gint offset=0; 
1922   gint i=0;
1923   gint length;
1924   char calling_number[MAXLENGTH]="";
1925
1926   indicators1 = tvb_get_guint8(parameter_tvb, 0);
1927   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
1928   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
1929   indicators2 = tvb_get_guint8(parameter_tvb, 1);
1930   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
1931   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
1932   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
1933   offset = 2;
1934
1935   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1936                                             offset, -1,
1937                                             "Connected Number");
1938   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1939
1940   length = tvb_length_remaining(parameter_tvb, offset);
1941   while(length > 0){
1942     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1943     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1944     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1945     if ((length - 1) > 0 ){ 
1946       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1947       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1948     } 
1949     offset++;
1950     length = tvb_length_remaining(parameter_tvb, offset);   
1951   }
1952
1953   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
1954       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
1955       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1956   }
1957   calling_number[i++] = '\0';
1958
1959   proto_item_set_text(address_digits_item, "Connected Number: %s", calling_number);  
1960   proto_item_set_text(parameter_item, "Connected Number: %s", calling_number);
1961   
1962 }
1963 /* ------------------------------------------------------------------
1964   Dissector Transit network selection
1965  */
1966 void 
1967 dissect_isup_transit_network_selection_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
1968 {
1969   proto_item *address_digits_item;
1970   proto_tree *address_digits_tree;
1971   guint8 indicators;
1972   guint8 address_digit_pair=0;
1973   gint offset=0; 
1974   gint i=0;
1975   gint length;
1976   char network_id[MAXLENGTH]="";
1977
1978   indicators = tvb_get_guint8(parameter_tvb, 0);
1979   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators);
1980   proto_tree_add_uint(parameter_tree, hf_isup_type_of_network_identification, parameter_tvb, 0, 1, indicators);
1981   proto_tree_add_uint(parameter_tree, hf_isup_network_identification_plan, parameter_tvb, 0, 1, indicators);
1982   offset = 1;
1983
1984   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
1985                                             offset, -1,
1986                                             "Network identification");
1987   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
1988
1989   length = tvb_length_remaining(parameter_tvb, offset);
1990   while(length > 0){
1991     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
1992     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1993     network_id[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
1994     if ((length - 1) > 0 ){ 
1995       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
1996       network_id[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
1997     } 
1998     offset++;
1999     length = tvb_length_remaining(parameter_tvb, offset);   
2000   }
2001
2002   if  (((indicators & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2003       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2004       network_id[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2005   }
2006   network_id[i++] = '\0';
2007
2008   proto_item_set_text(address_digits_item, "Network identification: %s", network_id);  
2009   proto_item_set_text(parameter_item, "Transit network selection: %s", network_id);
2010   
2011 }
2012 /* ------------------------------------------------------------------
2013   Dissector Parameter Circuit assignment map
2014  */
2015 void 
2016 dissect_isup_circuit_assignment_map_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2017 { guint8 map_type;
2018
2019   map_type = tvb_get_guint8(parameter_tvb, 0);
2020   proto_tree_add_uint(parameter_tree, hf_isup_map_type, parameter_tvb, 0, 1, map_type); 
2021   proto_tree_add_text(parameter_item, parameter_tvb, 1, 5, "Circuit assignment map (bit position indicates usage of corresponding circuit->3.69/Q.763)"); 
2022   proto_item_set_text(parameter_item, "Circuit assignment map");
2023 }
2024 /* ------------------------------------------------------------------
2025   Dissector Parameter Automatic congestion level
2026  */
2027 void 
2028 dissect_isup_automatic_congestion_level_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2029 { guint8 congestion_level;
2030
2031   congestion_level = tvb_get_guint8(parameter_tvb, 0);
2032   proto_tree_add_uint(parameter_tree, hf_isup_automatic_congestion_level, parameter_tvb, 0, AUTO_CONGEST_LEVEL_LENGTH, congestion_level); 
2033   proto_item_set_text(parameter_item, "Automatic congestion level: %s (%u)", val_to_str(congestion_level, isup_auto_congestion_level_value, "spare"), congestion_level);
2034 }
2035 /* ------------------------------------------------------------------
2036   Dissector Parameter Optional backward Call indicators
2037  */
2038 void 
2039 dissect_isup_optional_backward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2040
2041   guint8 indicators;
2042   
2043   indicators = tvb_get_guint8(parameter_tvb, 0);
2044   proto_tree_add_boolean(parameter_tree, hf_isup_inband_information_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
2045   proto_tree_add_boolean(parameter_tree, hf_isup_call_diversion_may_occur_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
2046   proto_tree_add_boolean(parameter_tree, hf_isup_simple_segmentation_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
2047   proto_tree_add_boolean(parameter_tree, hf_isup_mlpp_user_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
2048
2049
2050   proto_item_set_text(parameter_item,"Optional backward call indicators: 0x%x", indicators );
2051 }
2052 /* ------------------------------------------------------------------
2053   Dissector Parameter User-to-user indicators
2054  */
2055 void 
2056 dissect_isup_user_to_user_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2057
2058   guint8 indicators;
2059   
2060   indicators = tvb_get_guint8(parameter_tvb, 0);
2061   proto_tree_add_text(parameter_item, parameter_tvb, 0, USER_TO_USER_IND_LENGTH, "User-to-user indicators: 0x%x (refer to 3.60/Q.763 for detailed decoding)", indicators );
2062   proto_item_set_text(parameter_item,"User-to-user indicators: 0x%x", indicators );
2063 }
2064 /* ------------------------------------------------------------------
2065   Dissector Parameter Original ISC point code 
2066  */
2067 void 
2068 dissect_isup_original_isc_point_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2069
2070   guint16 spc;
2071   
2072   spc = tvb_get_letohs(parameter_tvb, 0) & 0x3FFF; /*since 1st 2 bits spare */
2073   proto_tree_add_text(parameter_item, parameter_tvb, 0, ORIGINAL_ISC_POINT_CODE_LENGTH, "Origination ISC Point Code: %u", spc); 
2074
2075   proto_item_set_text(parameter_item, "Origination ISC point code: %u", spc);
2076 }
2077 /* ------------------------------------------------------------------
2078   Dissector Parameter Generic notification indicator
2079  */
2080 void 
2081 dissect_isup_generic_notification_indicator_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2082
2083   guint8 indicators;
2084   
2085   indicators = tvb_get_guint8(parameter_tvb, 0);
2086   proto_tree_add_text(parameter_item, parameter_tvb, 0, GENERIC_NOTIFICATION_IND_LENGTH, "Generic notification indicator: 0x%x (refer to 3.25/Q.763 for detailed decoding)", indicators );
2087   proto_item_set_text(parameter_item,"Generic notification indicator: 0x%x", indicators );
2088 }
2089 /* ------------------------------------------------------------------
2090   Dissector Parameter Call history information
2091  */
2092 void 
2093 dissect_isup_call_history_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2094
2095   guint16 info;
2096   
2097   info = tvb_get_ntohs(parameter_tvb, 0);
2098   proto_tree_add_text(parameter_item, parameter_tvb, 0, CALL_HISTORY_INFO_LENGTH, "Call history info: propagation delay = %u ms", info);
2099   proto_item_set_text(parameter_item,"Call history info: propagation delay = %u ms", info);
2100 }
2101 /* ------------------------------------------------------------------
2102   Dissector Parameter Access delivery information
2103  */
2104 void 
2105 dissect_isup_access_delivery_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2106 { guint8 indicator;
2107
2108   indicator = tvb_get_guint8(parameter_tvb, 0);
2109   proto_tree_add_boolean(parameter_tree, hf_isup_access_delivery_ind, parameter_tvb, 0, ACCESS_DELIVERY_INFO_LENGTH, indicator); 
2110   proto_item_set_text(parameter_item, "Access delivery information: 0x%x", indicator);
2111 }
2112 /* ------------------------------------------------------------------
2113   Dissector Parameter Network specific facility
2114  */
2115 void 
2116 dissect_isup_network_specific_facility_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2117 { guint length = tvb_length(parameter_tvb);
2118   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Network specific facility (refer to 3.36/Q.763 for detailed decoding)"); 
2119   proto_item_set_text(parameter_item, "Network specific facility (%u byte%s length)", length , plurality(length, "", "s"));
2120 }
2121 /* ------------------------------------------------------------------
2122   Dissector Parameter User service information prime 
2123  */
2124 void 
2125 dissect_isup_user_service_information_prime_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2126 { guint length = tvb_length(parameter_tvb);
2127   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "User service information prime (-> Q.931)"); 
2128   proto_item_set_text(parameter_item, "User service information prime, see Q.931 (%u byte%s length)", length , plurality(length, "", "s"));
2129 }
2130 /* ------------------------------------------------------------------
2131   Dissector Parameter Propagation delay counter
2132  */
2133 void 
2134 dissect_isup_propagation_delay_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2135
2136   guint16 info;
2137   
2138   info = tvb_get_ntohs(parameter_tvb, 0);
2139   proto_tree_add_text(parameter_item, parameter_tvb, 0, PROPAGATION_DELAY_COUNT_LENGTH, "Propagation delay counter = %u ms", info);
2140   proto_item_set_text(parameter_item,"Propagation delay counter = %u ms", info);
2141 }
2142 /* ------------------------------------------------------------------
2143   Dissector Parameter Remote operations
2144  */
2145 void 
2146 dissect_isup_remote_operations_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2147 { guint length = tvb_length(parameter_tvb);
2148   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Remote operations"); 
2149   proto_item_set_text(parameter_item, "Remote operations (%u byte%s length)", length , plurality(length, "", "s"));
2150 }
2151 /* ------------------------------------------------------------------
2152   Dissector Parameter Service activation
2153  */
2154 void 
2155 dissect_isup_service_activation_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2156
2157   guint i;
2158   guint8 feature_code;
2159   guint length = tvb_length(parameter_tvb);
2160   for (i=0; i< length; i++){
2161     feature_code = tvb_get_guint8(parameter_tvb, i);
2162     proto_tree_add_text(parameter_item, parameter_tvb, i, 1, "Feature Code %u: %u", i+1, feature_code); 
2163   }
2164   proto_item_set_text(parameter_item, "Service Activation (%u byte%s length)", length , plurality(length, "", "s"));
2165 }
2166 /* ------------------------------------------------------------------
2167   Dissector Parameter User service information prime - no detailed dissection since defined in Rec. Q.931
2168  */
2169 void 
2170 dissect_isup_user_teleservice_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2171
2172   proto_tree_add_text(parameter_item, parameter_tvb, 0, USER_TELESERVICE_INFO_LENGTH, "User teleservice information (-> Q.931)"); 
2173   proto_item_set_text(parameter_item, "User teleservice information, see Q.931");
2174 }
2175 /* ------------------------------------------------------------------
2176   Dissector Parameter Transmission medium requirement used
2177  */
2178 void 
2179 dissect_isup_transmission_medium_used_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2180
2181   guint8 transmission_medium_requirement;
2182   
2183   transmission_medium_requirement = tvb_get_guint8(parameter_tvb, 0);
2184   proto_tree_add_uint(parameter_tree, hf_isup_transmission_medium_requirement_prime, parameter_tvb, 0, TRANSMISSION_MEDIUM_RQMT_PRIME_LENGTH,transmission_medium_requirement);
2185
2186   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"));
2187 }
2188 /* ------------------------------------------------------------------
2189   Dissector Parameter Call diversion information
2190  */
2191 void 
2192 dissect_isup_call_diversion_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2193 { guint8 indicator;
2194
2195   indicator = tvb_get_guint8(parameter_tvb, 0); 
2196   proto_tree_add_text(parameter_item, parameter_tvb, 0, CALL_DIV_INFO_LENGTH, "Call diversion information: 0x%x (refer to 3.6/Q.763 for detailed decoding)", indicator);
2197   proto_item_set_text(parameter_item, "Call diversion information: 0x%x", indicator);
2198 }
2199 /* ------------------------------------------------------------------
2200   Dissector Parameter Echo control  information
2201  */
2202 void 
2203 dissect_isup_echo_control_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2204 { guint8 indicator;
2205
2206   indicator = tvb_get_guint8(parameter_tvb, 0); 
2207   proto_tree_add_text(parameter_item, parameter_tvb, 0, ECHO_CONTROL_INFO_LENGTH, "Echo control information: 0x%x (refer to 3.19/Q.763 for detailed decoding)", indicator);
2208   proto_item_set_text(parameter_item, "Echo control information: 0x%x", indicator);
2209 }
2210 /* ------------------------------------------------------------------
2211   Dissector Parameter Message compatibility information
2212  */
2213 void 
2214 dissect_isup_message_compatibility_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2215 { guint length = tvb_length(parameter_tvb);
2216   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Message compatibility information (refer to 3.33/Q.763 for detailed decoding)"); 
2217   proto_item_set_text(parameter_item, "Message compatibility information (%u byte%s length)", length , plurality(length, "", "s"));
2218 }
2219 /* ------------------------------------------------------------------
2220   Dissector Parameter compatibility information
2221  */
2222 void 
2223 dissect_isup_parameter_compatibility_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2224
2225   guint length = tvb_length(parameter_tvb);
2226   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Parameter compatibility information (refer to 3.41/Q.763 for detailed decoding)"); 
2227   proto_item_set_text(parameter_item, "Parameter compatibility information (%u byte%s length)", length , plurality(length, "", "s"));
2228 }
2229 /* ------------------------------------------------------------------
2230   Dissector Parameter MLPP precedence
2231  */
2232 void dissect_isup_mlpp_precedence_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2233 {
2234   char NI_digits[5]="";
2235   guint8 indicators, digit_pair;
2236   guint32 bin_code;
2237
2238   indicators = tvb_get_guint8(parameter_tvb, 0);
2239   proto_tree_add_text(parameter_item, parameter_tvb, 0, 1, "LFB (Bits 6+7) and precedence level (Bits 1-4): 0x%x",indicators); 
2240   digit_pair = tvb_get_guint8(parameter_tvb, 1);
2241   NI_digits[0] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
2242   NI_digits[1] = number_to_char(digit_pair & DCBA_8BIT_MASK);
2243   digit_pair = tvb_get_guint8(parameter_tvb, 2);
2244   NI_digits[2] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
2245   NI_digits[3] = number_to_char(digit_pair & DCBA_8BIT_MASK);
2246   NI_digits[4] = '\0';
2247   proto_tree_add_text(parameter_item, parameter_tvb, 1, 2, "Network Identity: %s", NI_digits); 
2248   bin_code = tvb_get_ntoh24(parameter_tvb, 3);  
2249   proto_tree_add_text(parameter_item, parameter_tvb, 3, 3, "MLPP service domain: 0x%x", bin_code); 
2250   proto_item_set_text(parameter_item, "MLPP precedence: NI = %s, MLPP service domain = 0x%x", NI_digits, bin_code); 
2251 }
2252 /* ------------------------------------------------------------------
2253   Dissector Parameter MCID request indicators
2254  */
2255 void 
2256 dissect_isup_mcid_request_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2257 { guint8 indicator;
2258
2259   indicator = tvb_get_guint8(parameter_tvb, 0); 
2260   proto_tree_add_text(parameter_item, 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);
2261   proto_item_set_text(parameter_item, "MCID request indicators: 0x%x", indicator);
2262 }
2263 /* ------------------------------------------------------------------
2264   Dissector Parameter MCID response indicators
2265  */
2266 void 
2267 dissect_isup_mcid_response_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2268 { guint8 indicator;
2269
2270   indicator = tvb_get_guint8(parameter_tvb, 0); 
2271   proto_tree_add_text(parameter_item, 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);
2272   proto_item_set_text(parameter_item, "MCID response indicators: 0x%x", indicator);
2273 }
2274 /* ------------------------------------------------------------------
2275   Dissector Parameter Hop counter
2276  */
2277 void 
2278 dissect_isup_hop_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2279 { guint8 counter;
2280
2281   counter = tvb_get_guint8(parameter_tvb, 0) & EDCBA_8BIT_MASK; /* since bits H,G and F are spare */ 
2282   proto_tree_add_text(parameter_item, parameter_tvb, 0, HOP_COUNTER_LENGTH, "Hop counter: %u", counter);
2283   proto_item_set_text(parameter_item,  "Hop counter: %u", counter);
2284 }
2285 /* ------------------------------------------------------------------
2286   Dissector Parameter Transmission medium requirement prime
2287  */
2288 void 
2289 dissect_isup_transmission_medium_requirement_prime_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2290
2291   guint8 transmission_medium_requirement;
2292   
2293   transmission_medium_requirement = tvb_get_guint8(parameter_tvb, 0);
2294   proto_tree_add_uint(parameter_tree, hf_isup_transmission_medium_requirement_prime, parameter_tvb, 0, TRANSMISSION_MEDIUM_RQMT_PRIME_LENGTH,transmission_medium_requirement);
2295
2296   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"));
2297 }
2298
2299 /* ------------------------------------------------------------------
2300   Dissector Parameter location number
2301  */
2302 void 
2303 dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2304 {
2305   proto_item *address_digits_item;
2306   proto_tree *address_digits_tree;
2307   guint8 indicators1, indicators2;
2308   guint8 address_digit_pair=0;
2309   gint offset=0; 
2310   gint i=0;
2311   gint length;
2312   char calling_number[MAXLENGTH]="";
2313
2314   indicators1 = tvb_get_guint8(parameter_tvb, 0);
2315   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
2316   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2317   indicators2 = tvb_get_guint8(parameter_tvb, 1);
2318   proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
2319   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
2320   if ((indicators2 & GFE_8BIT_MASK) == 0x50)
2321     proto_tree_add_text(parameter_item, parameter_tvb, 1, 1, "Different meaning for Location Number: Numbering plan indicator = private numbering plan");
2322   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
2323   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
2324   offset = 2;
2325
2326   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2327                                             offset, -1,
2328                                             "Location number");
2329   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2330
2331   length = tvb_length_remaining(parameter_tvb, offset);
2332   while(length > 0){
2333     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2334     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2335     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2336     if ((length - 1) > 0 ){ 
2337       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2338       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2339     } 
2340     offset++;
2341     length = tvb_length_remaining(parameter_tvb, offset);   
2342   }
2343
2344   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2345       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2346       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2347   }
2348   calling_number[i++] = '\0';
2349
2350   proto_item_set_text(address_digits_item, "Location number: %s", calling_number);  
2351   proto_item_set_text(parameter_item, "Location number: %s", calling_number);
2352   
2353 }
2354 /* ------------------------------------------------------------------
2355   Dissector Parameter Redirection number restiriction
2356  */
2357 void 
2358 dissect_isup_redirection_number_restriction_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2359
2360   guint8 indicator;
2361   
2362   indicator = tvb_get_guint8(parameter_tvb, 0);
2363   switch (indicator & BA_8BIT_MASK) {
2364   case 0:
2365     proto_tree_add_text(parameter_item, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: Presentation allowed");
2366     break;
2367   case 1:
2368     proto_tree_add_text(parameter_item, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: Presentation restricted");
2369     break;
2370   default:
2371     proto_tree_add_text(parameter_item, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: spare");
2372     break;
2373   }
2374   proto_item_set_text(parameter_item, "Redirection number restriction: 0x%x ", indicator); 
2375 }
2376 /* ------------------------------------------------------------------
2377   Dissector Parameter Call transfer identity
2378  */
2379 void 
2380 dissect_isup_call_transfer_reference_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2381 { guint8 id;
2382
2383   id = tvb_get_guint8(parameter_tvb, 0);
2384   proto_tree_add_text(parameter_item, parameter_tvb, 0, CALL_TRANSFER_REF_LENGTH, "Call transfer identity: %u", id);
2385   proto_item_set_text(parameter_item,  "Call transfer reference: %u", id);
2386 }
2387 /* ------------------------------------------------------------------
2388   Dissector Parameter Loop prevention
2389  */
2390 void 
2391 dissect_isup_loop_prevention_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2392
2393   guint8 indicator;
2394   
2395   indicator = tvb_get_guint8(parameter_tvb, 0);
2396   if ((indicator & A_8BIT_MASK)==0) {
2397     proto_tree_add_text(parameter_item, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "Type: Request");
2398     proto_item_set_text(parameter_item, "Loop prevention indicators: Request (%u)", indicator); 
2399   }
2400   else {
2401     proto_tree_add_text(parameter_item, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "Type: Response");
2402     proto_tree_add_uint(parameter_item, hf_isup_loop_prevention_response_ind, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, indicator);
2403     proto_item_set_text(parameter_item, "Loop prevention indicators: Response (%u)", indicator); 
2404   }
2405 }
2406 /* ------------------------------------------------------------------
2407   Dissector Parameter Call transfer number
2408  */
2409 void 
2410 dissect_isup_call_transfer_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2411 {
2412   proto_item *address_digits_item;
2413   proto_tree *address_digits_tree;
2414   guint8 indicators1, indicators2;
2415   guint8 address_digit_pair=0;
2416   gint offset=0; 
2417   gint i=0;
2418   gint length;
2419   char calling_number[MAXLENGTH]="";
2420
2421   indicators1 = tvb_get_guint8(parameter_tvb, 0);
2422   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
2423   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2424   indicators2 = tvb_get_guint8(parameter_tvb, 1);
2425   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
2426   if ((indicators2 & GFE_8BIT_MASK) == 0x50)
2427     proto_tree_add_text(parameter_item, parameter_tvb, 1, 1, "Different meaning for Call Transfer Number: Numbering plan indicator = private numbering plan");
2428   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
2429   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 1, 1, indicators2);
2430   offset = 2;
2431
2432   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2433                                             offset, -1,
2434                                             "Call transfer number");
2435   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2436
2437   length = tvb_length_remaining(parameter_tvb, offset);
2438   while(length > 0){
2439     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2440     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2441     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2442     if ((length - 1) > 0 ){ 
2443       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2444       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2445     } 
2446     offset++;
2447     length = tvb_length_remaining(parameter_tvb, offset);   
2448   }
2449
2450   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2451       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2452       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2453   }
2454   calling_number[i++] = '\0';
2455
2456   proto_item_set_text(address_digits_item, "Call transfer number: %s", calling_number);  
2457   proto_item_set_text(parameter_item, "Call transfer number: %s", calling_number);
2458   
2459 }
2460 /* ------------------------------------------------------------------
2461   Dissector Parameter CCSS
2462  */
2463 void 
2464 dissect_isup_ccss_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2465
2466   guint8 indicator;
2467   
2468   indicator = tvb_get_guint8(parameter_tvb, 0);
2469   if ((indicator & A_8BIT_MASK)==0) {
2470     proto_tree_add_text(parameter_item, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "CCSS call indicator: no indication");
2471     proto_item_set_text(parameter_item, "CCSS call indicator: no indication (%u)", indicator); 
2472   }
2473   else {
2474     proto_tree_add_text(parameter_item, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "CCSS call indicator: CCSS call");
2475     proto_item_set_text(parameter_item, "CCSS call indicator: CCSS call (%u)", indicator); 
2476   }
2477 }
2478 /* ------------------------------------------------------------------ 
2479  Parameter Forward GVNS 
2480  */
2481 void
2482 dissect_isup_forward_gvns_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2483 { guint length = tvb_length(parameter_tvb);
2484   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Forward GVNS (refer to 3.66/Q.763 for detailed decoding)");
2485   proto_item_set_text(parameter_item, "Forward GVNS (%u Byte%s)", length , plurality(length, "", "s"));
2486 }
2487 /* ------------------------------------------------------------------ 
2488  Parameter Redirect capability
2489  */
2490 void
2491 dissect_isup_redirect_capability_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2492 { guint length = tvb_length(parameter_tvb);
2493   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Redirect capability (format is a national matter)");
2494   proto_item_set_text(parameter_item, "Redirect Capability (%u Byte%s)", length , plurality(length, "", "s"));
2495 }
2496 /* ------------------------------------------------------------------
2497   Dissector Parameter Backward GVNS
2498  */
2499 void 
2500 dissect_isup_backward_gvns_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2501 { guint8 indicator;
2502
2503   indicator = tvb_get_guint8(parameter_tvb, 0); 
2504   proto_tree_add_text(parameter_item, parameter_tvb, 0, BACKWARD_GVNS_LENGTH, "Backward GVNS: 0x%x (refer to 3.62/Q.763 for detailed decoding)", indicator);
2505   proto_item_set_text(parameter_item, "Backward GVNS: 0x%x", indicator);
2506 }
2507 /* ------------------------------------------------------------------
2508   Dissector Parameter Network management controls
2509  */
2510 void 
2511 dissect_isup_network_management_controls_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2512 { guint8 indicator;
2513
2514   indicator = tvb_get_guint8(parameter_tvb, 0); 
2515   proto_tree_add_boolean(parameter_item, hf_isup_temporary_alternative_routing_ind, parameter_tvb, 0,NETWORK_MANAGEMENT_CONTROLS_LENGTH, indicator);
2516   proto_tree_add_boolean(parameter_item, hf_isup_extension_ind, parameter_tvb, 0,NETWORK_MANAGEMENT_CONTROLS_LENGTH, indicator);
2517   proto_item_set_text(parameter_item, "Network management controls: 0x%x", indicator);
2518 }
2519 /* ------------------------------------------------------------------
2520   Dissector Parameter Correlation id - no detailed dissection since defined in Rec. Q.1281
2521  */
2522 void 
2523 dissect_isup_correlation_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2524 { guint length = tvb_length(parameter_tvb);
2525   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Correlation ID (-> Q.1281)"); 
2526   proto_item_set_text(parameter_item, "Correlation ID, see Q.1281 (%u Byte%s)", length , plurality(length, "", "s"));
2527 }
2528 /* ------------------------------------------------------------------
2529   Dissector Parameter SCF id - no detailed dissection since defined in Rec. Q.1281
2530  */
2531 void 
2532 dissect_isup_scf_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2533 { guint length = tvb_length(parameter_tvb);
2534   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "SCF ID (-> Q.1281)"); 
2535   proto_item_set_text(parameter_item, "SCF ID, see Q.1281 (%u Byte%s)", length , plurality(length, "", "s"));
2536 }
2537 /* ------------------------------------------------------------------
2538   Dissector Parameter Call diversion treatment indicators
2539  */
2540 void 
2541 dissect_isup_call_diversion_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2542 { guint8 indicator;
2543
2544   indicator = tvb_get_guint8(parameter_tvb, 0); 
2545   proto_tree_add_uint(parameter_item, hf_isup_call_to_be_diverted_ind, parameter_tvb, 0,CALL_DIV_TREATMENT_IND_LENGTH, indicator);
2546   proto_tree_add_boolean(parameter_item, hf_isup_extension_ind, parameter_tvb, 0, CALL_DIV_TREATMENT_IND_LENGTH, indicator);
2547   proto_item_set_text(parameter_item, "Call diversion treatment indicators: 0x%x", indicator);
2548 }
2549 /* ------------------------------------------------------------------
2550   Dissector Parameter called IN  number
2551  */
2552 void 
2553 dissect_isup_called_in_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2554 {
2555   proto_item *address_digits_item;
2556   proto_tree *address_digits_tree;
2557   guint8 indicators1, indicators2;
2558   guint8 address_digit_pair=0;
2559   gint offset=0; 
2560   gint i=0;
2561   gint length;
2562   char calling_number[MAXLENGTH]="";
2563
2564   indicators1 = tvb_get_guint8(parameter_tvb, 0);
2565   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
2566   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2567   indicators2 = tvb_get_guint8(parameter_tvb, 1);
2568   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
2569   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
2570   offset = 2;
2571
2572   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2573                                             offset, -1,
2574                                             "Called IN Number");
2575   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2576
2577   length = tvb_length_remaining(parameter_tvb, offset);
2578   while(length > 0){
2579     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2580     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2581     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2582     if ((length - 1) > 0 ){ 
2583       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2584       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2585     } 
2586     offset++;
2587     length = tvb_length_remaining(parameter_tvb, offset);   
2588   }
2589
2590   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2591       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2592       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2593   }
2594   calling_number[i++] = '\0';
2595
2596   proto_item_set_text(address_digits_item, "Called IN Number: %s", calling_number);  
2597   proto_item_set_text(parameter_item, "Called IN Number: %s", calling_number);
2598   
2599 }
2600 /* ------------------------------------------------------------------
2601   Dissector Parameter Call offering treatment indicators
2602  */
2603 void 
2604 dissect_isup_call_offering_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2605 { guint8 indicator;
2606
2607   indicator = tvb_get_guint8(parameter_tvb, 0); 
2608   proto_tree_add_uint(parameter_item, hf_isup_call_to_be_offered_ind, parameter_tvb, 0,CALL_OFFERING_TREATMENT_IND_LENGTH, indicator);
2609   proto_tree_add_boolean(parameter_item, hf_isup_extension_ind, parameter_tvb, 0, CALL_OFFERING_TREATMENT_IND_LENGTH, indicator);
2610   proto_item_set_text(parameter_item, "Call offering treatment indicators: 0x%x", indicator);
2611 }
2612 /* ------------------------------------------------------------------ 
2613  Parameter Charged party identification
2614  */
2615 void
2616 dissect_isup_charged_party_identification_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2617 { guint length = tvb_length(parameter_tvb);
2618   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Charged party identification (format is national network specific)");
2619   proto_item_set_text(parameter_item, "Charged party identification (%u Byte%s)", length , plurality(length, "", "s"));
2620 }
2621 /* ------------------------------------------------------------------
2622   Dissector Parameter Conference treatment indicators
2623  */
2624 void 
2625 dissect_isup_conference_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2626 { guint8 indicator;
2627
2628   indicator = tvb_get_guint8(parameter_tvb, 0); 
2629   proto_tree_add_uint(parameter_item, hf_isup_conference_acceptance_ind, parameter_tvb, 0,CONFERENCE_TREATMENT_IND_LENGTH, indicator);
2630   proto_tree_add_boolean(parameter_item, hf_isup_extension_ind, parameter_tvb, 0, CONFERENCE_TREATMENT_IND_LENGTH, indicator);
2631   proto_item_set_text(parameter_item, "Conference treatment indicators: 0x%x", indicator);
2632 }
2633 /* ------------------------------------------------------------------
2634   Dissector Parameter Display information
2635  */
2636 void 
2637 dissect_isup_display_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2638 { guint length = tvb_length(parameter_tvb);
2639   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Display information (-> Q.931)");
2640   proto_item_set_text(parameter_item, "Display information (%u Byte%s)", length , plurality(length, "", "s"));
2641 }
2642 /* ------------------------------------------------------------------ 
2643  Parameter UID action indicators
2644  */
2645 void
2646 dissect_isup_uid_action_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2647 { guint8 indicator;
2648
2649   indicator = tvb_get_guint8(parameter_tvb, 0); 
2650   proto_tree_add_text(parameter_item, parameter_tvb, 0,UID_ACTION_IND_LENGTH, "UID action indicators: 0x%x (refer to 3.78/Q.763 for detailed decoding)", indicator);
2651   proto_item_set_text(parameter_item, "UID action indicators: 0x%x", indicator);
2652 }
2653 /* ------------------------------------------------------------------ 
2654  Parameter UID capability indicators
2655  */
2656 void
2657 dissect_isup_uid_capability_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2658 { guint8 indicator;
2659
2660   indicator = tvb_get_guint8(parameter_tvb, 0); 
2661   proto_tree_add_text(parameter_item, parameter_tvb, 0,UID_CAPABILITY_IND_LENGTH, "UID capability indicators: 0x%x (refer to 3.79/Q.763 for detailed decoding)", indicator);
2662   proto_item_set_text(parameter_item, "UID capability indicators: 0x%x", indicator);
2663 }
2664 /* ------------------------------------------------------------------ 
2665  Parameter Redirect counter
2666  */
2667 void
2668 dissect_isup_redirect_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2669 { guint length = tvb_length(parameter_tvb);
2670   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Redirect counter (format is a national matter)");
2671   proto_item_set_text(parameter_item, "Redirect counter (%u Byte%s)", length , plurality(length, "", "s"));
2672 }
2673 /* ------------------------------------------------------------------
2674   Dissector Parameter Collect call request
2675  */
2676 void 
2677 dissect_isup_collect_call_request_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2678 { guint8 indicator;
2679
2680   indicator = tvb_get_guint8(parameter_tvb, 0); 
2681   if ((indicator & A_8BIT_MASK) == 0) {
2682     proto_tree_add_text(parameter_item, parameter_tvb, 0, COLLECT_CALL_REQUEST_LENGTH, "Collect call request indicator: no indication");
2683     proto_item_set_text(parameter_item, "Collect call reqeust: no indication (0x%x)", indicator);
2684   }
2685   else {
2686     proto_tree_add_text(parameter_item, parameter_tvb, 0, COLLECT_CALL_REQUEST_LENGTH, "Collect call request indicator: collect call requested");
2687     proto_item_set_text(parameter_item, "Collect call reqeust: collect call requested (0x%x)", indicator);
2688   }
2689 }
2690 /* ------------------------------------------------------------------
2691   Dissector Parameter Generic number
2692  */
2693 void 
2694 dissect_isup_generic_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2695 {
2696   proto_item *address_digits_item;
2697   proto_tree *address_digits_tree;
2698   guint8 indicators1, indicators2, nr_qualifier_ind;
2699   guint8 address_digit_pair=0;
2700   gint offset=0; 
2701   gint i=0;
2702   gint length;
2703   char calling_number[MAXLENGTH]="";
2704
2705   nr_qualifier_ind = tvb_get_guint8(parameter_tvb, 0);
2706   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);
2707   indicators1 = tvb_get_guint8(parameter_tvb, 1);
2708   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 1, 1, indicators1);
2709   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2710   indicators2 = tvb_get_guint8(parameter_tvb, 2);
2711   proto_tree_add_boolean(parameter_tree, hf_isup_ni_indicator, parameter_tvb, 2, 1, indicators2);
2712   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 2, 1, indicators2);
2713   if ((indicators2 & GFE_8BIT_MASK) == 0x50)
2714     proto_tree_add_text(parameter_item, parameter_tvb, 2, 1, "Different meaning for Generic Number: Numbering plan indicator = private numbering plan");
2715   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 2, 1, indicators2);
2716   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 2, 1, indicators2);
2717   offset = 3;
2718
2719   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2720                                             offset, -1,
2721                                             "Generic number");
2722   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2723
2724   length = tvb_length_remaining(parameter_tvb, offset);
2725   while(length > 0){
2726     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2727     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2728     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2729     if ((length - 1) > 0 ){ 
2730       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2731       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2732     } 
2733     offset++;
2734     length = tvb_length_remaining(parameter_tvb, offset);   
2735   }
2736
2737   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2738       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2739       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2740   }
2741   calling_number[i++] = '\0';
2742
2743   proto_item_set_text(address_digits_item, "Generic number: %s", calling_number);  
2744   proto_item_set_text(parameter_item, "Generic number: %s", calling_number);
2745   
2746 }
2747 /* ------------------------------------------------------------------ 
2748  Dissector Parameter Generic digits
2749  */
2750 void
2751 dissect_isup_generic_digits_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2752 { guint length = tvb_length(parameter_tvb);
2753   proto_tree_add_text(parameter_item, parameter_tvb, 0, length, "Generic digits (refer to 3.24/Q.673 for detailed decoding)");
2754   proto_item_set_text(parameter_item, "Generic digits (%u Byte%s)", length , plurality(length, "", "s"));
2755 }
2756 /* ------------------------------------------------------------------ */
2757 void
2758 dissect_isup_unknown_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2759 { guint length = tvb_length(parameter_tvb);
2760   proto_item_set_text(parameter_item, "Parameter Type unknown/reserved (%u Byte%s)", length , plurality(length, "", "s"));
2761 }
2762 /* ------------------------------------------------------------------ */
2763
2764 /* ------------------------------------------------------------------
2765   Dissector all optional parameters
2766 */
2767 void
2768 dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, proto_tree *isup_tree)
2769 { proto_item* parameter_item;
2770   proto_tree* parameter_tree;
2771   gint offset = 0;
2772   guint parameter_type, parameter_length, actual_length;
2773   tvbuff_t *parameter_tvb;
2774
2775   /* Dissect all optional parameters while end of message isn't reached */
2776   parameter_type = 0xFF; /* Start-initializiation since parameter_type is used for while-condition */
2777   
2778   while ((tvb_length_remaining(optional_parameters_tvb, offset)  >= 1) && (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS)){
2779     parameter_type = tvb_get_guint8(optional_parameters_tvb, offset);
2780     
2781     if (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS){
2782       parameter_length = tvb_get_guint8(optional_parameters_tvb, offset + PARAMETER_TYPE_LENGTH);
2783       
2784       parameter_item = proto_tree_add_text(isup_tree, optional_parameters_tvb,
2785                                            offset,
2786                                            parameter_length  + PARAMETER_TYPE_LENGTH + PARAMETER_LENGTH_IND_LENGTH,
2787                                            "Parameter: type %u",
2788                                            parameter_type);
2789       parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
2790       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"));       
2791       offset += PARAMETER_TYPE_LENGTH;
2792       
2793       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);
2794       offset += PARAMETER_LENGTH_IND_LENGTH;
2795       
2796       actual_length = tvb_length_remaining(optional_parameters_tvb, offset);
2797       if (actual_length > 0){
2798         parameter_tvb = tvb_new_subset(optional_parameters_tvb, offset, MIN(parameter_length, actual_length), parameter_length);
2799         switch (parameter_type) {
2800         case PARAM_TYPE_CALL_REF:
2801           dissect_isup_call_reference_parameter(parameter_tvb, parameter_tree, parameter_item);
2802           break;
2803         case PARAM_TYPE_TRANSM_MEDIUM_REQU:
2804           dissect_isup_transmission_medium_requirement_parameter(parameter_tvb, parameter_tree, parameter_item);
2805           break;
2806         case PARAM_TYPE_ACC_TRANSP:
2807           dissect_isup_access_transport_parameter(parameter_tvb, parameter_tree, parameter_item);
2808           break;
2809         case PARAM_TYPE_CALLED_PARTY_NR:
2810           dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2811           break;
2812         case PARAM_TYPE_SUBSQT_NR:
2813           dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2814           break;
2815         case PARAM_TYPE_NATURE_OF_CONN_IND:
2816           dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2817           break;
2818         case PARAM_TYPE_FORW_CALL_IND:
2819           dissect_isup_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2820           break;
2821         case PARAM_TYPE_OPT_FORW_CALL_IND:
2822           dissect_isup_optional_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2823           break;
2824         case PARAM_TYPE_CALLING_PRTY_CATEG:
2825           dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item);
2826           break;
2827         case PARAM_TYPE_CALLING_PARTY_NR:
2828           dissect_isup_calling_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2829           break;
2830         case PARAM_TYPE_REDIRECTING_NR:
2831           dissect_isup_redirecting_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2832           break;
2833         case PARAM_TYPE_REDIRECTION_NR:
2834           dissect_isup_redirection_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2835           break;
2836         case PARAM_TYPE_CONNECTION_REQ:
2837           dissect_isup_connection_request_parameter(parameter_tvb, parameter_tree, parameter_item);
2838           break;
2839         case PARAM_TYPE_INFO_REQ_IND:
2840           dissect_isup_information_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2841           break;
2842         case PARAM_TYPE_INFO_IND:
2843           dissect_isup_information_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2844           break;
2845         case PARAM_TYPE_CONTINUITY_IND:
2846           dissect_isup_continuity_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2847           break;
2848         case PARAM_TYPE_BACKW_CALL_IND:
2849           dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2850           break;
2851         case PARAM_TYPE_CAUSE_INDICATORS:
2852           dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2853           break;
2854         case PARAM_TYPE_REDIRECTION_INFO:
2855           dissect_isup_redirection_information_parameter(parameter_tvb, parameter_tree, parameter_item);
2856           break;
2857         case PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE:
2858           dissect_isup_circuit_group_supervision_message_type_parameter(parameter_tvb, parameter_tree, parameter_item);
2859           break;
2860         case PARAM_TYPE_RANGE_AND_STATUS:
2861           dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
2862           break;
2863         case PARAM_TYPE_FACILITY_IND:
2864           dissect_isup_facility_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
2865           break;
2866         case PARAM_TYPE_CLSD_USR_GRP_ILOCK_CD:
2867           dissect_isup_closed_user_group_interlock_code_parameter(parameter_tvb, parameter_tree, parameter_item);
2868           break;
2869         case PARAM_TYPE_USER_SERVICE_INFO:
2870           dissect_isup_user_service_information_parameter(parameter_tvb, parameter_tree, parameter_item);
2871           break;
2872         case PARAM_TYPE_SIGNALLING_POINT_CODE:
2873           dissect_isup_signalling_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);    
2874           break;
2875         case PARAM_TYPE_USER_TO_USER_INFO:
2876           dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
2877           break;
2878         case PARAM_TYPE_CONNECTED_NR:
2879           dissect_isup_connected_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2880           break;
2881         case PARAM_TYPE_SUSP_RESUME_IND:
2882           dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2883           break;
2884         case PARAM_TYPE_TRANSIT_NETW_SELECT:
2885           dissect_isup_transit_network_selection_parameter(parameter_tvb, parameter_tree, parameter_item);
2886           break;
2887         case PARAM_TYPE_EVENT_INFO:
2888           dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item);
2889           break;
2890         case PARAM_TYPE_CIRC_ASSIGN_MAP:
2891           dissect_isup_circuit_assignment_map_parameter(parameter_tvb, parameter_tree, parameter_item);
2892           break;
2893         case PARAM_TYPE_CIRC_STATE_IND:
2894           dissect_isup_circuit_state_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
2895           break;
2896         case PARAM_TYPE_AUTO_CONG_LEVEL:
2897           dissect_isup_automatic_congestion_level_parameter(parameter_tvb, parameter_tree, parameter_item);
2898           break;
2899         case PARAM_TYPE_ORIG_CALLED_NR:
2900           dissect_isup_original_called_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2901           break;
2902         case PARAM_TYPE_OPT_BACKW_CALL_IND:
2903           dissect_isup_optional_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2904           break;
2905         case PARAM_TYPE_USER_TO_USER_IND:
2906           dissect_isup_user_to_user_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2907           break;
2908         case PARAM_TYPE_ORIG_ISC_POINT_CODE:
2909           dissect_isup_original_isc_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);          
2910           break;
2911         case PARAM_TYPE_GENERIC_NOTIF_IND:
2912           dissect_isup_generic_notification_indicator_parameter(parameter_tvb, parameter_tree, parameter_item);   
2913           break;
2914         case PARAM_TYPE_CALL_HIST_INFO :
2915           dissect_isup_call_history_information_parameter(parameter_tvb, parameter_tree, parameter_item);         
2916           break;
2917         case PARAM_TYPE_ACC_DELIV_INFO:
2918           dissect_isup_access_delivery_information_parameter(parameter_tvb, parameter_tree, parameter_item);      
2919           break;
2920         case PARAM_TYPE_NETW_SPECIFIC_FACLTY:
2921           dissect_isup_network_specific_facility_parameter(parameter_tvb, parameter_tree, parameter_item);        
2922           break;
2923         case PARAM_TYPE_USER_SERVICE_INFO_PR:
2924           dissect_isup_user_service_information_prime_parameter(parameter_tvb, parameter_tree, parameter_item);   
2925           break;
2926         case PARAM_TYPE_PROPAG_DELAY_COUNTER:
2927           dissect_isup_propagation_delay_counter_parameter(parameter_tvb, parameter_tree, parameter_item);        
2928           break;
2929         case PARAM_TYPE_REMOTE_OPERATIONS:
2930           dissect_isup_remote_operations_parameter(parameter_tvb, parameter_tree, parameter_item);        
2931           break;
2932         case PARAM_TYPE_SERVICE_ACTIVATION:
2933           dissect_isup_service_activation_parameter(parameter_tvb, parameter_tree, parameter_item);       
2934           break;
2935         case PARAM_TYPE_USER_TELESERV_INFO:
2936           dissect_isup_user_teleservice_information_parameter(parameter_tvb, parameter_tree, parameter_item);     
2937           break;
2938         case PARAM_TYPE_TRANSM_MEDIUM_USED:
2939           dissect_isup_transmission_medium_used_parameter(parameter_tvb, parameter_tree, parameter_item);         
2940           break;
2941         case PARAM_TYPE_CALL_DIV_INFO:
2942           dissect_isup_call_diversion_information_parameter(parameter_tvb, parameter_tree, parameter_item);       
2943           break;
2944         case PARAM_TYPE_ECHO_CTRL_INFO:
2945           dissect_isup_echo_control_information_parameter(parameter_tvb, parameter_tree, parameter_item);         
2946           break;
2947         case PARAM_TYPE_MSG_COMPAT_INFO:
2948           dissect_isup_message_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);        
2949           break;
2950         case PARAM_TYPE_PARAM_COMPAT_INFO:
2951           dissect_isup_parameter_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);      
2952           break;
2953         case PARAM_TYPE_MLPP_PRECEDENCE:
2954           dissect_isup_mlpp_precedence_parameter(parameter_tvb, parameter_tree, parameter_item);          
2955           break;
2956         case PARAM_TYPE_MCID_REQ_IND:
2957           dissect_isup_mcid_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);          
2958           break;
2959         case PARAM_TYPE_MCID_RSP_IND:
2960           dissect_isup_mcid_response_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);         
2961           break;
2962         case PARAM_TYPE_HOP_COUNTER:
2963           dissect_isup_hop_counter_parameter(parameter_tvb, parameter_tree, parameter_item);      
2964           break;
2965         case PARAM_TYPE_TRANSM_MEDIUM_RQUR_PR:
2966           dissect_isup_transmission_medium_requirement_prime_parameter(parameter_tvb, parameter_tree, parameter_item);    
2967           break;
2968         case PARAM_TYPE_LOCATION_NR:
2969           dissect_isup_location_number_parameter(parameter_tvb, parameter_tree, parameter_item);          
2970           break;
2971         case PARAM_TYPE_REDIR_NR_RSTRCT:
2972           dissect_isup_redirection_number_restriction_parameter(parameter_tvb, parameter_tree, parameter_item);   
2973           break;
2974         case PARAM_TYPE_CALL_TRANS_REF:
2975           dissect_isup_call_transfer_reference_parameter(parameter_tvb, parameter_tree, parameter_item);          
2976           break;
2977         case PARAM_TYPE_LOOP_PREV_IND:
2978           dissect_isup_loop_prevention_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);       
2979           break;
2980         case PARAM_TYPE_CALL_TRANS_NR:
2981           dissect_isup_call_transfer_number_parameter(parameter_tvb, parameter_tree, parameter_item);     
2982           break;
2983         case PARAM_TYPE_CCSS:
2984           dissect_isup_ccss_parameter(parameter_tvb, parameter_tree, parameter_item);     
2985           break;
2986         case PARAM_TYPE_FORW_GVNS:
2987           dissect_isup_forward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);     
2988           break;
2989         case PARAM_TYPE_BACKW_GVNS:
2990           dissect_isup_backward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);    
2991           break;
2992         case PARAM_TYPE_REDIRECT_CAPAB:
2993           dissect_isup_redirect_capability_parameter(parameter_tvb, parameter_tree, parameter_item);      
2994           break;
2995         case PARAM_TYPE_NETW_MGMT_CTRL:
2996           dissect_isup_network_management_controls_parameter(parameter_tvb, parameter_tree, parameter_item);      
2997           break;
2998         case PARAM_TYPE_CORRELATION_ID:
2999           dissect_isup_correlation_id_parameter(parameter_tvb, parameter_tree, parameter_item);   
3000           break;
3001         case PARAM_TYPE_SCF_ID:
3002           dissect_isup_scf_id_parameter(parameter_tvb, parameter_tree, parameter_item);   
3003           break;
3004         case PARAM_TYPE_CALL_DIV_TREAT_IND:
3005           dissect_isup_call_diversion_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);      
3006           break;
3007         case PARAM_TYPE_CALLED_IN_NR:
3008           dissect_isup_called_in_number_parameter(parameter_tvb, parameter_tree, parameter_item);         
3009           break;
3010         case PARAM_TYPE_CALL_OFF_TREAT_IND:
3011           dissect_isup_call_offering_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);       
3012           break;
3013         case PARAM_TYPE_CHARGED_PARTY_IDENT:
3014           dissect_isup_charged_party_identification_parameter(parameter_tvb, parameter_tree, parameter_item);     
3015           break;
3016         case PARAM_TYPE_CONF_TREAT_IND:
3017           dissect_isup_conference_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);          
3018           break;
3019         case PARAM_TYPE_DISPLAY_INFO:
3020           dissect_isup_display_information_parameter(parameter_tvb, parameter_tree, parameter_item);      
3021           break;
3022         case PARAM_TYPE_UID_ACTION_IND:
3023           dissect_isup_uid_action_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);    
3024           break;
3025         case PARAM_TYPE_UID_CAPAB_IND:
3026           dissect_isup_uid_capability_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);        
3027           break;
3028         case PARAM_TYPE_REDIRECT_COUNTER:
3029           dissect_isup_redirect_counter_parameter(parameter_tvb, parameter_tree, parameter_item);         
3030           break;
3031         case PARAM_TYPE_COLLECT_CALL_REQ:
3032           dissect_isup_collect_call_request_parameter(parameter_tvb, parameter_tree, parameter_item);     
3033           break;
3034         case PARAM_TYPE_GENERIC_NR:
3035           dissect_isup_generic_number_parameter(parameter_tvb, parameter_tree, parameter_item);   
3036           break;
3037         case PARAM_TYPE_GENERIC_DIGITS:
3038           dissect_isup_generic_digits_parameter(parameter_tvb, parameter_tree, parameter_item);   
3039           break;          
3040         default:
3041           dissect_isup_unknown_parameter(parameter_tvb, parameter_tree, parameter_item);
3042           break;
3043         }
3044         offset += MIN(parameter_length, actual_length);
3045       }
3046       
3047     }
3048     else {
3049         /* End of optional parameters is reached */
3050         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);
3051     }
3052   }
3053 }
3054
3055 /* ------------------------------------------------------------------ */
3056 /* Dissectors for all used message types                              */
3057 /* Called by dissect_isup_message(),                                  */ 
3058 /* call parameter dissectors in order of mandatory parameters         */
3059 /* (since not labeled)                                                */
3060 /* ------------------------------------------------------------------
3061   Dissector Message Type Initial address message 
3062  */
3063 gint
3064 dissect_isup_initial_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3065 { proto_item* parameter_item;
3066   proto_tree* parameter_tree;
3067   tvbuff_t *parameter_tvb;
3068   gint offset = 0;
3069   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3070   
3071   /* Do stuff for first mandatory fixed parameter: Nature of Connection Indicators */
3072   parameter_type = PARAM_TYPE_NATURE_OF_CONN_IND;
3073   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3074                                        NATURE_OF_CONNECTION_IND_LENGTH,
3075                                        "Nature of Connection Indicators");
3076   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3077   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"));               
3078   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3079   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(NATURE_OF_CONNECTION_IND_LENGTH, actual_length), NATURE_OF_CONNECTION_IND_LENGTH);
3080   dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3081   offset += NATURE_OF_CONNECTION_IND_LENGTH;
3082
3083   /* Do stuff for 2nd mandatory fixed parameter: Forward Call Indicators */
3084   parameter_type =  PARAM_TYPE_FORW_CALL_IND;
3085   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3086                                        FORWARD_CALL_IND_LENGTH,
3087                                        "Forward Call Indicators");
3088   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3089   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"));               
3090   actual_length = tvb_ensure_length_remaining(message_tvb, offset); 
3091   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FORWARD_CALL_IND_LENGTH, actual_length), FORWARD_CALL_IND_LENGTH );
3092   dissect_isup_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3093   offset +=  FORWARD_CALL_IND_LENGTH;
3094
3095   /* Do stuff for 3nd mandatory fixed parameter: Calling party's category */
3096   parameter_type = PARAM_TYPE_CALLING_PRTY_CATEG;
3097   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3098                                        CALLING_PRTYS_CATEGORY_LENGTH,
3099                                        "Calling Party's category");
3100   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3101   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"));               
3102   actual_length = tvb_ensure_length_remaining(message_tvb, offset); 
3103   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CALLING_PRTYS_CATEGORY_LENGTH, actual_length),CALLING_PRTYS_CATEGORY_LENGTH );
3104   dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item);
3105   offset += CALLING_PRTYS_CATEGORY_LENGTH;
3106
3107   /* Do stuff for 4th mandatory fixed parameter: Transmission medium requirement */
3108   parameter_type = PARAM_TYPE_TRANSM_MEDIUM_REQU;
3109   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3110                                        TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH,
3111                                        "Transmission medium requirement");
3112   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3113   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"));                      
3114   actual_length = tvb_ensure_length_remaining(message_tvb, offset); 
3115   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH, actual_length), TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH);
3116   dissect_isup_transmission_medium_requirement_parameter(parameter_tvb, parameter_tree, parameter_item);
3117   offset += TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH;
3118
3119
3120   /* Do stuff for mandatory variable parameter Called party number */
3121   parameter_type = PARAM_TYPE_CALLED_PARTY_NR;
3122   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3123   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3124
3125   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3126                                        offset +  parameter_pointer,
3127                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3128                                        "Called Party Number");
3129   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3130   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"));       
3131   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);  
3132   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);
3133   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3134   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3135   dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3136   offset += PARAMETER_POINTER_LENGTH;
3137
3138   return offset;
3139 }
3140 /* ------------------------------------------------------------------
3141   Dissector Message Type subsequent address message 
3142  */
3143 gint dissect_isup_subsequent_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3144 { proto_item* parameter_item;
3145   proto_tree* parameter_tree;
3146   tvbuff_t *parameter_tvb;
3147   gint offset = 0;
3148   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3149   
3150   /* Do stuff for mandatory variable parameter Subsequent number */
3151   parameter_type = PARAM_TYPE_SUBSQT_NR;
3152
3153   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3154   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3155
3156   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3157                                        offset +  parameter_pointer,
3158                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3159                                        "Subsequent Number");
3160   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3161   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"));       
3162   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);  
3163   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);
3164   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3165   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3166   dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3167   offset += PARAMETER_POINTER_LENGTH;
3168
3169   return offset;
3170 }
3171
3172 /* ------------------------------------------------------------------
3173   Dissector Message Type Information request message 
3174  */
3175 gint
3176 dissect_isup_information_request_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3177 { proto_item* parameter_item;
3178   proto_tree* parameter_tree;
3179   tvbuff_t *parameter_tvb;
3180   gint offset = 0;
3181   gint parameter_type, actual_length;
3182  
3183   /* Do stuff for first mandatory fixed parameter: Information request indicators*/ 
3184   parameter_type = PARAM_TYPE_INFO_REQ_IND;
3185   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3186                                        INFO_REQUEST_IND_LENGTH,
3187                                        "Information request indicators");
3188   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3189   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"));               
3190   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3191   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(INFO_REQUEST_IND_LENGTH, actual_length), INFO_REQUEST_IND_LENGTH);
3192   dissect_isup_information_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3193   offset += INFO_REQUEST_IND_LENGTH;
3194   return offset;
3195 }
3196 /* ------------------------------------------------------------------
3197   Dissector Message Type Information  
3198  */
3199 gint
3200 dissect_isup_information_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3201 { proto_item* parameter_item;
3202   proto_tree* parameter_tree;
3203   tvbuff_t *parameter_tvb;
3204   gint offset = 0;
3205   gint parameter_type, actual_length;
3206  
3207   /* Do stuff for first mandatory fixed parameter: Information  indicators*/ 
3208   parameter_type = PARAM_TYPE_INFO_IND;
3209   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3210                                        INFO_IND_LENGTH,
3211                                        "Information indicators");
3212   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3213   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"));               
3214   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3215   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(INFO_IND_LENGTH, actual_length), INFO_IND_LENGTH);
3216   dissect_isup_information_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3217   offset += INFO_IND_LENGTH;
3218   return offset;
3219 }
3220 /* ------------------------------------------------------------------
3221   Dissector Message Type Continuity 
3222  */
3223 gint
3224 dissect_isup_continuity_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3225 { proto_item* parameter_item;
3226   proto_tree* parameter_tree;
3227   tvbuff_t *parameter_tvb;
3228   gint offset = 0;
3229   gint parameter_type, actual_length;
3230  
3231   /* Do stuff for first mandatory fixed parameter: Continuity indicators*/ 
3232   parameter_type = PARAM_TYPE_CONTINUITY_IND;
3233   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3234                                        CONTINUITY_IND_LENGTH,
3235                                        "Continuity indicators");
3236   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3237   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"));               
3238   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3239   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CONTINUITY_IND_LENGTH, actual_length), CONTINUITY_IND_LENGTH);
3240   dissect_isup_continuity_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3241   offset += CONTINUITY_IND_LENGTH;
3242   return offset;
3243 }
3244 /* ------------------------------------------------------------------
3245   Dissector Message Type Address complete
3246  */
3247 gint
3248 dissect_isup_address_complete_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3249 { proto_item* parameter_item;
3250   proto_tree* parameter_tree;
3251   tvbuff_t *parameter_tvb;
3252   gint offset = 0;
3253   gint parameter_type, actual_length;
3254  
3255   /* Do stuff for first mandatory fixed parameter: backward call indicators*/ 
3256   parameter_type = PARAM_TYPE_BACKW_CALL_IND;
3257   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3258                                        BACKWARD_CALL_IND_LENGTH,
3259                                        "Backward Call Indicators");
3260   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3261   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"));               
3262   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3263   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(BACKWARD_CALL_IND_LENGTH, actual_length), BACKWARD_CALL_IND_LENGTH);
3264   dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3265   offset += BACKWARD_CALL_IND_LENGTH;
3266   return offset;
3267 }
3268 /* ------------------------------------------------------------------
3269   Dissector Message Type Connect
3270  */
3271 gint
3272 dissect_isup_connect_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3273 { proto_item* parameter_item;
3274   proto_tree* parameter_tree;
3275   tvbuff_t *parameter_tvb;
3276   gint offset = 0;
3277   gint parameter_type, actual_length;
3278  
3279   /* Do stuff for first mandatory fixed parameter: backward call indicators*/ 
3280   parameter_type = PARAM_TYPE_BACKW_CALL_IND;
3281   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3282                                        BACKWARD_CALL_IND_LENGTH,
3283                                        "Backward Call Indicators");
3284   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3285   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"));               
3286   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3287   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(BACKWARD_CALL_IND_LENGTH, actual_length), BACKWARD_CALL_IND_LENGTH);
3288   dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3289   offset += BACKWARD_CALL_IND_LENGTH;
3290   return offset;
3291 }
3292 /* ------------------------------------------------------------------
3293   Dissector Message Type release message 
3294  */
3295 gint 
3296 dissect_isup_release_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3297 { proto_item* parameter_item;
3298   proto_tree* parameter_tree;
3299   tvbuff_t *parameter_tvb;
3300   gint offset = 0;
3301   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3302   
3303   /* Do stuff for mandatory variable parameter Cause indicators */
3304   parameter_type =  PARAM_TYPE_CAUSE_INDICATORS;
3305
3306   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3307   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3308
3309   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3310                                        offset +  parameter_pointer,
3311                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3312                                        "Cause indicators, see Q.850");
3313   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3314   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"));       
3315   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);  
3316   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);
3317   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3318   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3319   dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3320   offset += PARAMETER_POINTER_LENGTH;
3321
3322   return offset;
3323 }
3324 /* ------------------------------------------------------------------
3325   Dissector Message Type Resume/Suspend
3326  */
3327 gint
3328 dissect_isup_suspend_resume_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3329 { proto_item* parameter_item;
3330   proto_tree* parameter_tree;
3331   tvbuff_t *parameter_tvb;
3332   gint offset = 0;
3333   gint parameter_type, actual_length;
3334  
3335   /* Do stuff for first mandatory fixed parameter: backward call indicators*/ 
3336   parameter_type = PARAM_TYPE_SUSP_RESUME_IND;
3337   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3338                                        SUSPEND_RESUME_IND_LENGTH,
3339                                        "Suspend/Resume indicator");
3340   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3341   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"));               
3342   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3343   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(SUSPEND_RESUME_IND_LENGTH, actual_length), SUSPEND_RESUME_IND_LENGTH);
3344   dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3345   offset += SUSPEND_RESUME_IND_LENGTH;
3346   return offset;
3347 }
3348 /* ------------------------------------------------------------------
3349   Dissector Message Type Circuit group reset/query message
3350  */
3351 gint 
3352 dissect_isup_circuit_group_reset_query_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3353 { proto_item* parameter_item;
3354   proto_tree* parameter_tree;
3355   tvbuff_t *parameter_tvb;
3356   gint offset = 0;
3357   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3358   
3359   /* Do stuff for mandatory variable parameter range and status*/
3360   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3361
3362   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3363   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3364
3365   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3366                                        offset +  parameter_pointer,
3367                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3368                                        "Range and status");
3369   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3370   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"));       
3371   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);  
3372   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);
3373   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3374   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3375   dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3376   offset += PARAMETER_POINTER_LENGTH;
3377
3378   return offset;
3379 }
3380 /* ------------------------------------------------------------------
3381   Dissector Message Type Circuit group blocking/blocking ack/unblocking/unblocking ack messages 
3382  */
3383 gint 
3384 dissect_isup_circuit_group_blocking_messages(tvbuff_t *message_tvb, proto_tree *isup_tree)
3385 { proto_item* parameter_item;
3386   proto_tree* parameter_tree;
3387   tvbuff_t *parameter_tvb;
3388   gint offset = 0;
3389   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3390
3391    /* Do stuff for first mandatory fixed parameter: circuit group supervision message type*/ 
3392   parameter_type = PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE;
3393   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3394                                        CIRC_GRP_SV_MSG_TYPE_LENGTH,
3395                                        "Circuit group supervision message type");
3396   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3397   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"));               
3398   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3399   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CIRC_GRP_SV_MSG_TYPE_LENGTH, actual_length), CIRC_GRP_SV_MSG_TYPE_LENGTH);
3400   dissect_isup_circuit_group_supervision_message_type_parameter(parameter_tvb, parameter_tree, parameter_item);
3401   offset += CIRC_GRP_SV_MSG_TYPE_LENGTH;
3402   
3403   /* Do stuff for mandatory variable parameter range and status*/
3404   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3405
3406   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3407   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3408
3409   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3410                                        offset +  parameter_pointer,
3411                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3412                                        "Facility indicator");
3413   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3414   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"));       
3415   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);  
3416   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);
3417   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3418   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3419   dissect_isup_facility_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
3420   offset += PARAMETER_POINTER_LENGTH;
3421
3422   return offset;
3423 }
3424
3425 /* ------------------------------------------------------------------
3426   Dissector Message Type Facility request/accepted
3427  */
3428 gint
3429 dissect_isup_facility_request_accepted_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3430 { proto_item* parameter_item;
3431   proto_tree* parameter_tree;
3432   tvbuff_t *parameter_tvb;
3433   gint offset = 0;
3434   gint parameter_type, actual_length;
3435  
3436   /* Do stuff for first mandatory fixed parameter: facility indicators*/ 
3437   parameter_type = PARAM_TYPE_FACILITY_IND;
3438   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3439                                        FACILITY_IND_LENGTH,
3440                                        "Facility indicator");
3441   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3442   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"));               
3443   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3444   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FACILITY_IND_LENGTH, actual_length), FACILITY_IND_LENGTH);
3445   dissect_isup_facility_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
3446   offset += FACILITY_IND_LENGTH;
3447   return offset;
3448 }
3449 /* ------------------------------------------------------------------
3450   Dissector Message Type Facility reject
3451  */
3452 gint
3453 dissect_isup_facility_reject_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3454 { proto_item* parameter_item;
3455   proto_tree* parameter_tree;
3456   tvbuff_t *parameter_tvb;
3457   gint offset = 0;
3458   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3459  
3460   /* Do stuff for first mandatory fixed parameter: facility indicators*/ 
3461   parameter_type = PARAM_TYPE_FACILITY_IND;
3462   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3463                                        FACILITY_IND_LENGTH,
3464                                        "Facility indicator");
3465   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3466   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"));               
3467   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3468   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FACILITY_IND_LENGTH, actual_length), FACILITY_IND_LENGTH);
3469   dissect_isup_facility_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
3470   offset += FACILITY_IND_LENGTH;
3471
3472   /* Do stuff for mandatory variable parameter Cause indicators */
3473   parameter_type =  PARAM_TYPE_CAUSE_INDICATORS;
3474
3475   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3476   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3477
3478   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3479                                        offset +  parameter_pointer,
3480                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3481                                        "Cause indicators, see Q.850");
3482   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3483   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"));       
3484   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);  
3485   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);
3486   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3487   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3488   dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3489   offset += PARAMETER_POINTER_LENGTH;
3490
3491   return offset;
3492 }
3493 /* ------------------------------------------------------------------
3494   Dissector Message Type Circuit group reset acknowledgement message 
3495  */
3496 gint 
3497 dissect_isup_circuit_group_reset_acknowledgement_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3498 { proto_item* parameter_item;
3499   proto_tree* parameter_tree;
3500   tvbuff_t *parameter_tvb;
3501   gint offset = 0;
3502   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3503   
3504   /* Do stuff for mandatory variable parameter range and status*/
3505   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3506
3507   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3508   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3509
3510   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3511                                        offset +  parameter_pointer,
3512                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3513                                        "Range and status");
3514   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3515   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"));       
3516   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);  
3517   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);
3518   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3519   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3520   dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3521   offset += PARAMETER_POINTER_LENGTH;
3522
3523   return offset;
3524 }
3525 /* ------------------------------------------------------------------
3526   Dissector Message Type Circuit group query response message
3527  */
3528 gint 
3529 dissect_isup_circuit_group_query_response_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3530 { proto_item* parameter_item;
3531   proto_tree* parameter_tree;
3532   tvbuff_t *parameter_tvb;
3533   gint offset = 0;
3534   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3535   
3536   /* Do stuff for 1. mandatory variable parameter range and status*/
3537   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3538
3539   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3540   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3541
3542   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3543                                        offset +  parameter_pointer,
3544                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3545                                        "Range and status");
3546   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3547   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"));       
3548   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);  
3549   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);
3550   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3551   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3552   dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3553   offset += PARAMETER_POINTER_LENGTH;
3554
3555   /* Do stuff for 2. mandatory variable parameter Circuit state indicator*/
3556   parameter_type = PARAM_TYPE_CIRC_STATE_IND;
3557
3558   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3559   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3560
3561   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3562                                        offset +  parameter_pointer,
3563                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3564                                        "Circuit state indicator (national use)");
3565   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3566   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"));       
3567   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);  
3568   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);
3569   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3570   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3571   dissect_isup_circuit_state_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
3572   offset += PARAMETER_POINTER_LENGTH;
3573
3574   return offset;
3575 }
3576 /* ------------------------------------------------------------------
3577   Dissector Message Type Call Progress
3578 */
3579 gint
3580 dissect_isup_call_progress_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3581 { proto_item* parameter_item;
3582   proto_tree* parameter_tree;
3583   tvbuff_t *parameter_tvb;
3584   gint offset = 0;
3585   gint parameter_type, actual_length;
3586  
3587   /* Do stuff for first mandatory fixed parameter: Event information*/ 
3588   parameter_type = PARAM_TYPE_EVENT_INFO;
3589   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3590                                        EVENT_INFO_LENGTH,
3591                                        "Event information");
3592   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3593   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"));               
3594   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3595   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(EVENT_INFO_LENGTH, actual_length), EVENT_INFO_LENGTH);
3596   dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3597   offset += EVENT_INFO_LENGTH;
3598   return offset;
3599 }
3600 /* ------------------------------------------------------------------
3601   Dissector Message Type User-to-User information
3602  */
3603 gint 
3604 dissect_isup_user_to_user_information_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3605 { proto_item* parameter_item;
3606   proto_tree* parameter_tree;
3607   tvbuff_t *parameter_tvb;
3608   gint offset = 0;
3609   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3610   
3611   /* Do stuff for mandatory variable parameter User-to-user information*/
3612   parameter_type =  PARAM_TYPE_USER_TO_USER_INFO;
3613
3614   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3615   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3616
3617   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3618                                        offset +  parameter_pointer,
3619                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3620                                        "User-to-user information, see Q.931");
3621   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3622   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"));       
3623   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);  
3624   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);
3625   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3626   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3627   dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3628   offset += PARAMETER_POINTER_LENGTH;
3629
3630   return offset;
3631 }
3632 /* ------------------------------------------------------------------
3633   Dissector Message Type Confusion  
3634  */
3635 gint 
3636 dissect_isup_confusion_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3637 { proto_item* parameter_item;
3638   proto_tree* parameter_tree;
3639   tvbuff_t *parameter_tvb;
3640   gint offset = 0;
3641   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3642   
3643   /* Do stuff for mandatory variable parameter Cause indicators */
3644   parameter_type =  PARAM_TYPE_CAUSE_INDICATORS;
3645
3646   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3647   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3648
3649   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3650                                        offset +  parameter_pointer,
3651                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3652                                        "Cause indicators, see Q.850");
3653   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3654   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"));       
3655   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);  
3656   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);
3657   actual_length = tvb_ensure_length_remaining(message_tvb, offset);            
3658   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3659   dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3660   offset += PARAMETER_POINTER_LENGTH;
3661
3662   return offset;
3663 }
3664 /* ------------------------------------------------------------------ */
3665 void
3666 dissect_isup_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup_tree)
3667
3668   tvbuff_t *parameter_tvb;
3669   tvbuff_t *optional_parameter_tvb;
3670   proto_item* pass_along_item;
3671   proto_tree* pass_along_tree;
3672   gint offset, bufferlength;
3673   guint8 message_type, opt_parameter_pointer;
3674   gint opt_part_possible = FALSE; /* default setting - for message types allowing optional 
3675                                      params explicitely set to TRUE in case statement */
3676   offset = 0;
3677   
3678   /* Extract message type field */
3679   message_type = tvb_get_guint8(message_tvb,0); 
3680
3681   if (check_col(pinfo->cinfo, COL_INFO)){
3682     col_append_str(pinfo->cinfo, COL_INFO, val_to_str(message_type, isup_message_type_value, "reserved"));
3683     col_append_str(pinfo->cinfo, COL_INFO, " ");
3684   }
3685  
3686    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);
3687    offset +=  MESSAGE_TYPE_LENGTH;
3688
3689    bufferlength = tvb_ensure_length_remaining(message_tvb, offset);
3690    parameter_tvb = tvb_new_subset(message_tvb, offset, bufferlength, bufferlength);
3691
3692    /* distinguish between message types:*/
3693    switch (message_type) {
3694      case MESSAGE_TYPE_INITIAL_ADDR:
3695        offset += dissect_isup_initial_address_message(parameter_tvb, isup_tree);
3696        opt_part_possible = TRUE;
3697       break;
3698     case MESSAGE_TYPE_SUBSEQ_ADDR:
3699        offset += dissect_isup_subsequent_address_message(parameter_tvb, isup_tree);
3700        opt_part_possible = TRUE;
3701       break;
3702     case MESSAGE_TYPE_INFO_REQ:
3703        offset += dissect_isup_information_request_message(parameter_tvb, isup_tree);
3704        opt_part_possible = TRUE;
3705       break;
3706     case MESSAGE_TYPE_INFO:
3707        offset += dissect_isup_information_message(parameter_tvb, isup_tree);
3708        opt_part_possible = TRUE;
3709       break;
3710     case MESSAGE_TYPE_CONTINUITY:
3711        offset += dissect_isup_continuity_message(parameter_tvb, isup_tree);
3712       break;
3713     case MESSAGE_TYPE_ADDR_CMPL:
3714        offset += dissect_isup_address_complete_message(parameter_tvb, isup_tree);
3715        opt_part_possible = TRUE;
3716       break;
3717     case MESSAGE_TYPE_CONNECT:
3718        offset += dissect_isup_connect_message(parameter_tvb, isup_tree);
3719        opt_part_possible = TRUE;
3720       break;
3721     case MESSAGE_TYPE_FORW_TRANS:
3722       /* no dissector necessary since no mandatory parameters included */
3723        opt_part_possible = TRUE;
3724       break;
3725     case MESSAGE_TYPE_ANSWER:
3726       /* no dissector necessary since no mandatory parameters included */
3727        opt_part_possible = TRUE;
3728       break;
3729     case MESSAGE_TYPE_RELEASE:
3730        offset += dissect_isup_release_message(parameter_tvb, isup_tree);
3731        opt_part_possible = TRUE;
3732       break;
3733     case MESSAGE_TYPE_SUSPEND:
3734        offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
3735        opt_part_possible = TRUE;
3736       break;
3737     case MESSAGE_TYPE_RESUME:
3738        offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
3739        opt_part_possible = TRUE;
3740       break;
3741     case MESSAGE_TYPE_REL_CMPL:
3742       /* no dissector necessary since no mandatory parameters included */
3743        opt_part_possible = TRUE;
3744       break;
3745     case MESSAGE_TYPE_CONT_CHECK_REQ:
3746       /* no dissector necessary since no mandatory parameters included */
3747       break;
3748     case MESSAGE_TYPE_RESET_CIRCUIT:
3749       /* no dissector necessary since no mandatory parameters included */
3750       break;
3751     case MESSAGE_TYPE_BLOCKING:
3752       /* no dissector necessary since no mandatory parameters included */
3753       break;
3754     case MESSAGE_TYPE_UNBLOCKING:
3755       /* no dissector necessary since no mandatory parameters included */
3756       break;
3757     case MESSAGE_TYPE_BLOCK_ACK:
3758       /* no dissector necessary since no mandatory parameters included */
3759       break;
3760     case MESSAGE_TYPE_UNBLOCK_ACK:
3761       /* no dissector necessary since no mandatory parameters included */
3762       break;
3763     case MESSAGE_TYPE_CIRC_GRP_RST:
3764        offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
3765       break;
3766     case MESSAGE_TYPE_CIRC_GRP_BLCK:
3767        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3768       break;
3769     case MESSAGE_TYPE_CIRC_GRP_UNBL:
3770        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3771       break;
3772     case MESSAGE_TYPE_CIRC_GRP_BL_ACK:
3773        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3774       break;
3775     case MESSAGE_TYPE_CIRC_GRP_UNBL_ACK:
3776        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3777       break;
3778     case MESSAGE_TYPE_FACILITY_REQ:
3779        offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
3780        opt_part_possible = TRUE;
3781       break;
3782     case MESSAGE_TYPE_FACILITY_ACC:
3783        offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
3784        opt_part_possible = TRUE;
3785       break;
3786     case MESSAGE_TYPE_FACILITY_REJ:
3787        offset += dissect_isup_facility_reject_message(parameter_tvb, isup_tree);
3788        opt_part_possible = TRUE;
3789       break;
3790     case MESSAGE_TYPE_LOOP_BACK_ACK:
3791       /* no dissector necessary since no mandatory parameters included */
3792       break;
3793     case MESSAGE_TYPE_PASS_ALONG:
3794       /* call dissect_isup_message recursively */
3795       { guint8 pa_message_type;
3796         pa_message_type = tvb_get_guint8(parameter_tvb, 0);
3797         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);
3798         pass_along_tree = proto_item_add_subtree(pass_along_item, ett_isup_pass_along_message);
3799         dissect_isup_message(parameter_tvb, pinfo, pass_along_tree);
3800         break;
3801       }
3802     case MESSAGE_TYPE_CIRC_GRP_RST_ACK:
3803        offset += dissect_isup_circuit_group_reset_acknowledgement_message(parameter_tvb, isup_tree);
3804       break;
3805     case MESSAGE_TYPE_CIRC_GRP_QRY:
3806        offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
3807       break;
3808     case MESSAGE_TYPE_CIRC_GRP_QRY_RSP:
3809        offset += dissect_isup_circuit_group_query_response_message(parameter_tvb, isup_tree);
3810       break;
3811     case MESSAGE_TYPE_CALL_PROGRSS:
3812        offset += dissect_isup_call_progress_message(parameter_tvb, isup_tree);
3813        opt_part_possible = TRUE;
3814       break;
3815     case MESSAGE_TYPE_USER2USER_INFO:
3816       offset += dissect_isup_user_to_user_information_message(parameter_tvb, isup_tree);
3817       opt_part_possible = TRUE;
3818       break;
3819     case MESSAGE_TYPE_UNEQUIPPED_CIC:
3820       /* no dissector necessary since no mandatory parameters included */
3821       break;
3822     case MESSAGE_TYPE_CONFUSION:
3823       offset += dissect_isup_confusion_message(parameter_tvb, isup_tree);
3824        opt_part_possible = TRUE;
3825       break;
3826     case MESSAGE_TYPE_OVERLOAD:
3827       /* no dissector necessary since no mandatory parameters included */
3828       break;
3829     case MESSAGE_TYPE_CHARGE_INFO:
3830       /* do nothing since format is a national matter */
3831       proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Format is a national matter"); 
3832       break;
3833     case MESSAGE_TYPE_NETW_RESRC_MGMT:
3834       /* no dissector necessary since no mandatory parameters included */
3835        opt_part_possible = TRUE;
3836       break;
3837     case MESSAGE_TYPE_FACILITY:
3838       /* no dissector necessary since no mandatory parameters included */
3839        opt_part_possible = TRUE;
3840       break;
3841     case MESSAGE_TYPE_USER_PART_TEST:
3842       /* no dissector necessary since no mandatory parameters included */
3843        opt_part_possible = TRUE;
3844       break;
3845     case MESSAGE_TYPE_USER_PART_AVAIL:
3846       /* no dissector necessary since no mandatory parameters included */
3847        opt_part_possible = TRUE;
3848       break;
3849     case MESSAGE_TYPE_IDENT_REQ:
3850       /* no dissector necessary since no mandatory parameters included */
3851        opt_part_possible = TRUE;
3852       break;
3853     case MESSAGE_TYPE_IDENT_RSP:
3854       /* no dissector necessary since no mandatory parameters included */
3855        opt_part_possible = TRUE;
3856       break;
3857     case MESSAGE_TYPE_SEGMENTATION:
3858       /* no dissector necessary since no mandatory parameters included */
3859        opt_part_possible = TRUE;
3860       break;
3861     case MESSAGE_TYPE_LOOP_PREVENTION:
3862       /* no dissector necessary since no mandatory parameters included */
3863        opt_part_possible = TRUE;
3864       break;
3865     default:
3866       proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Unknown Message type (possibly reserved/used in former ISUP version)");
3867       break;
3868   }
3869    
3870    /* extract pointer to start of optional part (if any) */
3871    if (opt_part_possible == TRUE){
3872      opt_parameter_pointer = tvb_get_guint8(message_tvb, offset);
3873      if (opt_parameter_pointer > 0){
3874        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);  
3875        offset += opt_parameter_pointer;
3876        optional_parameter_tvb = tvb_new_subset(message_tvb, offset, -1, -1 );
3877        dissect_isup_optional_parameter(optional_parameter_tvb, isup_tree);
3878      }
3879      else
3880        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);  
3881    }
3882    else if (message_type !=MESSAGE_TYPE_CHARGE_INFO)
3883      proto_tree_add_text(isup_tree, message_tvb, 0, 0, "No optional parameters are possible with this message type");  
3884     
3885 }
3886  
3887 /* ------------------------------------------------------------------ */
3888 void
3889 dissect_isup(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3890 {
3891
3892 /* Set up structures needed to add the protocol subtree and manage it */
3893         proto_item *ti;
3894         proto_tree *isup_tree;
3895         tvbuff_t *message_tvb;
3896         guint16 cic; 
3897
3898 /* Make entries in Protocol column and Info column on summary display */
3899         if (check_col(pinfo->cinfo, COL_PROTOCOL)) 
3900                 col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISUP");
3901
3902         if (check_col(pinfo->cinfo, COL_INFO)) 
3903                 col_add_str(pinfo->cinfo, COL_INFO, "ISUP message: ");
3904
3905 /* In the interest of speed, if "tree" is NULL, don't do any work not
3906    necessary to generate protocol tree items. */
3907         if (tree) {
3908                 ti = proto_tree_add_item(tree, proto_isup, tvb, 0, -1, FALSE);
3909                 isup_tree = proto_item_add_subtree(ti, ett_isup);
3910
3911                 /* dissect CIC in main dissector since pass-along message type carrying complete IUSP message w/o CIC needs 
3912                    recursive message dissector call */
3913                 cic =          tvb_get_letohs(tvb, CIC_OFFSET) & 0x0FFF; /*since upper 4 bits spare */ 
3914                 
3915                 proto_tree_add_uint_format(isup_tree, hf_isup_cic, tvb, CIC_OFFSET, CIC_LENGTH, cic, "CIC: %u", cic);  
3916
3917                 message_tvb = tvb_new_subset(tvb, CIC_LENGTH, -1, -1);
3918                 dissect_isup_message(message_tvb, pinfo, isup_tree);
3919         }
3920 }
3921
3922
3923 /*---------------------------------------------------------------------*/
3924 /* Register the protocol with Ethereal */
3925 void
3926 proto_register_isup(void)
3927 {                 
3928 /* Setup list of header fields  See Section 1.6.1 for details*/
3929         static hf_register_info hf[] = {
3930                 { &hf_isup_cic,
3931                         { "CIC",           "isup.cic",
3932                         FT_UINT16, BASE_HEX, NULL, 0xFF0F,          
3933                           "", HFILL }}, 
3934
3935                 { &hf_isup_message_type,
3936                         { "Message Type",  "isup.message_type",
3937                         FT_UINT8, BASE_DEC, NULL, 0x0,          
3938                         "", HFILL }},
3939                         
3940                 { &hf_isup_parameter_type,
3941                         { "Parameter Type",  "isup.parameter_type",
3942                         FT_UINT8, BASE_DEC, NULL, 0x0,
3943                         "", HFILL }},
3944                         
3945                 { &hf_isup_parameter_length,
3946                         { "Parameter Length",  "isup.parameter_length",
3947                         FT_UINT8, BASE_DEC, NULL, 0x0,
3948                         "", HFILL }},
3949                         
3950                 { &hf_isup_mandatory_variable_parameter_pointer,
3951                         { "Pointer to Parameter",  "isup.mandatory_variable_parameter_pointer",
3952                         FT_UINT8, BASE_DEC, NULL, 0x0,
3953                         "", HFILL }},
3954
3955                 { &hf_isup_pointer_to_start_of_optional_part,
3956                         { "Pointer to optional parameter part",  "isup.optional_parameter_part_pointer",
3957                         FT_UINT8, BASE_DEC, NULL, 0x0,
3958                         "", HFILL }},
3959
3960                 { &hf_isup_satellite_indicator,
3961                         { "Satellite Indicator",  "isup.satellite_indicator",
3962                         FT_UINT8, BASE_HEX, VALS(isup_satellite_ind_value), BA_8BIT_MASK,
3963                         "", HFILL }},
3964
3965                 { &hf_isup_continuity_check_indicator,
3966                         { "Continuity Check Indicator",  "isup.continuity_check_indicator",
3967                         FT_UINT8, BASE_HEX, VALS(isup_continuity_check_ind_value), DC_8BIT_MASK,
3968                         "", HFILL }},
3969
3970                 { &hf_isup_echo_control_device_indicator,
3971                         { "Echo Control Device Indicator",  "isup.echo_control_device_indicator",
3972                         FT_BOOLEAN, 8, TFS(&isup_echo_control_device_ind_value),E_8BIT_MASK,
3973                         "", HFILL }},
3974
3975                 { &hf_isup_forw_call_natnl_inatnl_call_indicator,
3976                         { "National/international call indicator",  "isup.forw_call_natnl_inatnl_call_indicator",
3977                         FT_BOOLEAN, 16, TFS(&isup_natnl_inatnl_call_ind_value),A_16BIT_MASK,
3978                         "", HFILL }},
3979
3980                 { &hf_isup_forw_call_end_to_end_method_indicator,
3981                         { "End-to-end method indicator",  "isup.forw_call_end_to_end_method_indicator",
3982                         FT_UINT16, BASE_HEX, VALS(isup_end_to_end_method_ind_value), CB_16BIT_MASK,
3983                         "", HFILL }},
3984
3985                 { &hf_isup_forw_call_interworking_indicator,
3986                         { "Interworking indicator",  "isup.forw_call_interworking_indicator",
3987                         FT_BOOLEAN, 16, TFS(&isup_interworking_ind_value), D_16BIT_MASK,
3988                         "", HFILL }},
3989
3990                 { &hf_isup_forw_call_end_to_end_info_indicator,
3991                         { "End-to-end information indicator",  "isup.forw_call_end_to_end_information_indicator",
3992                         FT_BOOLEAN, 16, TFS(&isup_end_to_end_info_ind_value), E_16BIT_MASK,
3993                         "", HFILL }},
3994
3995                 { &hf_isup_forw_call_isdn_user_part_indicator,
3996                         { "ISDN user part indicator",  "isup.forw_call_isdn_user_part_indicator",
3997                         FT_BOOLEAN, 16, TFS(&isup_ISDN_user_part_ind_value), F_16BIT_MASK,
3998                         "", HFILL }},
3999
4000                 { &hf_isup_forw_call_preferences_indicator,
4001                         { "ISDN user part preference indicator",  "isup.forw_call_preferences_indicator",
4002                         FT_UINT16, BASE_HEX, VALS(isup_preferences_ind_value), HG_16BIT_MASK,
4003                         "", HFILL }},
4004
4005                 { &hf_isup_forw_call_isdn_access_indicator,
4006                         { "ISDN access indicator",  "isup.forw_call_isdn_access_indicator",
4007                         FT_BOOLEAN, 16, TFS(&isup_ISDN_originating_access_ind_value), I_16BIT_MASK,
4008                         "", HFILL }},
4009
4010                 { &hf_isup_forw_call_sccp_method_indicator,
4011                         { "SCCP method indicator",  "isup.forw_call_sccp_method_indicator",
4012                         FT_UINT16, BASE_HEX, VALS(isup_SCCP_method_ind_value), KJ_16BIT_MASK,
4013                         "", HFILL }},
4014                                                         
4015                 { &hf_isup_calling_partys_category,
4016                         { "Calling Party's category",  "isup.calling_partys_category",
4017                         FT_UINT8, BASE_HEX, VALS(isup_calling_partys_category_value), 0x0,
4018                         "", HFILL }},
4019                 
4020                 { &hf_isup_transmission_medium_requirement,
4021                         { "Transmission medium requirement",  "isup.transmission_medium_requirement",
4022                         FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_value), 0x0,
4023                         "", HFILL }},
4024
4025                 { &hf_isup_odd_even_indicator,
4026                         { "Odd/even indicator",  "isup.isdn_odd_even_indicator",
4027                         FT_BOOLEAN, 8, TFS(&isup_odd_even_ind_value), ISUP_ODD_EVEN_MASK,
4028                         "", HFILL }},
4029
4030                 { &hf_isup_called_party_nature_of_address_indicator,
4031                         { "Nature of address indicator",  "isup.called_party_nature_of_address_indicator",
4032                         FT_UINT8, BASE_DEC, VALS(isup_called_party_nature_of_address_ind_value), ISUP_NATURE_OF_ADDRESS_IND_MASK,
4033                         "", HFILL }},
4034                                         
4035                 { &hf_isup_calling_party_nature_of_address_indicator,
4036                         { "Nature of address indicator",  "isup.calling_party_nature_of_address_indicator",
4037                         FT_UINT8, BASE_DEC, VALS(isup_calling_party_nature_of_address_ind_value), ISUP_NATURE_OF_ADDRESS_IND_MASK,
4038                         "", HFILL }},
4039                                         
4040                 { &hf_isup_inn_indicator,
4041                         { "INN indicator",  "isup.inn_indicator",
4042                         FT_BOOLEAN, 8, TFS(&isup_INN_ind_value), ISUP_INN_MASK,
4043                         "", HFILL }},
4044
4045                 { &hf_isup_ni_indicator,
4046                         { "NI indicator",  "isup.ni_indicator",
4047                         FT_BOOLEAN, 8, TFS(&isup_NI_ind_value), ISUP_NI_MASK,
4048                         "", HFILL }},
4049
4050                 { &hf_isup_numbering_plan_indicator,
4051                         { "Numbering plan indicator",  "isup.numbering_plan_indicator",
4052                         FT_UINT8, BASE_DEC, VALS(isup_numbering_plan_ind_value), ISUP_NUMBERING_PLAN_IND_MASK,
4053                         "", HFILL }},
4054
4055                 { &hf_isup_address_presentation_restricted_indicator,
4056                         { "Address presentation restricted indicator",  "isup.address_presentation_restricted_indicator",
4057                         FT_UINT8, BASE_DEC, VALS(isup_address_presentation_restricted_ind_value), ISUP_ADDRESS_PRESENTATION_RESTR_IND_MASK,
4058                         "", HFILL }},
4059
4060                 { &hf_isup_screening_indicator,
4061                         { "Screening indicator",  "isup.screening_indicator",
4062                         FT_UINT8, BASE_DEC, VALS(isup_screening_ind_value), ISUP_SCREENING_IND_MASK,
4063                         "", HFILL }},
4064
4065                 { &hf_isup_screening_indicator_enhanced,
4066                         { "Screening indicator",  "isup.screening_indicator_enhanced",
4067                         FT_UINT8, BASE_DEC, VALS(isup_screening_ind_enhanced_value), ISUP_SCREENING_IND_MASK,
4068                         "", HFILL }},
4069
4070                 { &hf_isup_called_party_odd_address_signal_digit,
4071                         { "Address signal digit",  "isup.called_party_odd_address_signal_digit",
4072                         FT_UINT8, BASE_DEC, VALS(isup_called_party_address_digit_value), ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK,
4073                         "", HFILL }},
4074
4075                 { &hf_isup_calling_party_odd_address_signal_digit,
4076                         { "Address signal digit",  "isup.calling_party_odd_address_signal_digit",
4077                         FT_UINT8, BASE_DEC, VALS(isup_calling_party_address_digit_value), ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK,
4078                         "", HFILL }},
4079
4080                 { &hf_isup_called_party_even_address_signal_digit,
4081                         { "Address signal digit",  "isup.called_party_even_address_signal_digit",
4082                         FT_UINT8, BASE_DEC, VALS(isup_called_party_address_digit_value), ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK,
4083                         "", HFILL }},
4084                                         
4085                 { &hf_isup_calling_party_even_address_signal_digit,
4086                         { "Address signal digit",  "isup.calling_party_even_address_signal_digit",
4087                         FT_UINT8, BASE_DEC, VALS(isup_calling_party_address_digit_value), ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK,
4088                         "", HFILL }},
4089                                         
4090                 { &hf_isup_calling_party_address_request_indicator,
4091                         { "Calling party address request indicator",  "isup.calling_party_address_request_indicator",
4092                         FT_BOOLEAN, 16, TFS(&isup_calling_party_address_request_ind_value), A_16BIT_MASK,
4093                         "", HFILL }},
4094                                         
4095                 { &hf_isup_info_req_holding_indicator,
4096                         { "Holding indicator",  "isup.info_req_holding_indicator",
4097                         FT_BOOLEAN, 16, TFS(&isup_holding_ind_value), B_16BIT_MASK,
4098                         "", HFILL }},
4099                                         
4100                 { &hf_isup_calling_partys_category_request_indicator,
4101                         { "Calling party's category request indicator",  "isup.calling_partys_category_request_indicator",
4102                         FT_BOOLEAN, 16, TFS(&isup_calling_partys_category_request_ind_value), D_16BIT_MASK,
4103                         "", HFILL }},
4104                                         
4105                 { &hf_isup_charge_information_request_indicator,
4106                         { "Charge information request indicator",  "isup.charge_information_request_indicator",
4107                         FT_BOOLEAN, 16, TFS(&isup_charge_information_request_ind_value), E_16BIT_MASK,
4108                         "", HFILL }},
4109                                         
4110                 { &hf_isup_malicious_call_identification_request_indicator,
4111                         { "Malicious call identification request indicator (ISUP'88)",  "isup.malicious_call_ident_request_indicator",
4112                         FT_BOOLEAN, 16, TFS(&isup_malicious_call_identification_request_ind_value), H_16BIT_MASK,
4113                         "", HFILL }},
4114
4115                 { &hf_isup_calling_party_address_response_indicator,
4116                         { "Calling party address response indicator",  "isup.calling_party_address_response_indicator",
4117                         FT_UINT16, BASE_HEX, VALS(isup_calling_party_address_response_ind_value), BA_16BIT_MASK,
4118                         "", HFILL }},
4119                                         
4120                 { &hf_isup_hold_provided_indicator,
4121                         { "Hold provided indicator",  "isup.hold_provided_indicator",
4122                         FT_BOOLEAN, 16, TFS(&isup_hold_provided_ind_value), C_16BIT_MASK,
4123                         "", HFILL }},
4124                                         
4125                 { &hf_isup_calling_partys_category_response_indicator,
4126                         { "Calling party's category response indicator",  "isup.calling_partys_category_response_indicator",
4127                         FT_BOOLEAN, 16, TFS(&isup_calling_partys_category_response_ind_value), F_16BIT_MASK,
4128                         "", HFILL }},
4129                                         
4130                 { &hf_isup_charge_information_response_indicator,
4131                         { "Charge information response indicator",  "isup.charge_information_response_indicator",
4132                         FT_BOOLEAN, 16, TFS(&isup_charge_information_response_ind_value), G_16BIT_MASK,
4133                         "", HFILL }},
4134                                         
4135                 { &hf_isup_solicited_indicator,
4136                         { "Solicited indicator",  "isup.solicided_indicator",
4137                         FT_BOOLEAN, 16, TFS(&isup_solicited_information_ind_value), H_16BIT_MASK,
4138                         "", HFILL }},
4139
4140                 { &hf_isup_continuity_indicator,
4141                         { "Continuity indicator",  "isup.continuity_indicator",
4142                         FT_BOOLEAN, 8, TFS(&isup_continuity_ind_value), A_8BIT_MASK,
4143                         "", HFILL }},
4144
4145                 { &hf_isup_backw_call_charge_ind,
4146                         { "Charge indicator",  "isup.charge_indicator",
4147                         FT_UINT16, BASE_HEX, VALS(isup_charge_ind_value), BA_16BIT_MASK,
4148                         "", HFILL }},
4149
4150                 { &hf_isup_backw_call_called_partys_status_ind,
4151                         { "Called party's status indicator",  "isup.called_partys_status_indicator",
4152                         FT_UINT16, BASE_HEX, VALS(isup_called_partys_status_ind_value), DC_16BIT_MASK,
4153                         "", HFILL }},
4154
4155                 { &hf_isup_backw_call_called_partys_category_ind,
4156                         { "Called party's category indicator",  "isup.called_partys_category_indicator",
4157                         FT_UINT16, BASE_HEX, VALS(isup_called_partys_category_ind_value), FE_16BIT_MASK,
4158                         "", HFILL }},
4159
4160                 { &hf_isup_backw_call_end_to_end_method_ind,
4161                         { "End-to-end method indicator",  "isup.backw_call_end_to_end_method_indicator",
4162                         FT_UINT16, BASE_HEX, VALS(isup_end_to_end_method_ind_value), HG_16BIT_MASK,
4163                         "", HFILL }},
4164
4165                 { &hf_isup_backw_call_interworking_ind,
4166                         { "Interworking indicator",  "isup.backw_call_interworking_indicator",
4167                         FT_BOOLEAN, 16, TFS(&isup_interworking_ind_value), I_16BIT_MASK,
4168                         "", HFILL }},
4169
4170                 { &hf_isup_backw_call_end_to_end_info_ind,
4171                         { "End-to-end information indicator",  "isup.backw_call_end_to_end_information_indicator",
4172                         FT_BOOLEAN, 16, TFS(&isup_end_to_end_info_ind_value), J_16BIT_MASK,
4173                         "", HFILL }},
4174
4175                 { &hf_isup_backw_call_isdn_user_part_ind,
4176                         { "ISDN user part indicator",  "isup.backw_call_isdn_user_part_indicator",
4177                         FT_BOOLEAN, 16, TFS(&isup_ISDN_user_part_ind_value), K_16BIT_MASK,
4178                         "", HFILL }},
4179
4180                 { &hf_isup_backw_call_holding_ind,
4181                         { "Holding indicator",  "isup.backw_call_holding_indicator",
4182                         FT_BOOLEAN, 16, TFS(&isup_holding_ind_value), L_16BIT_MASK,
4183                         "", HFILL }},
4184                                         
4185                 { &hf_isup_backw_call_isdn_access_ind,
4186                         { "ISDN access indicator",  "isup.backw_call_isdn_access_indicator",
4187                         FT_BOOLEAN, 16, TFS(&isup_ISDN_terminating_access_ind_value), M_16BIT_MASK,
4188                         "", HFILL }},
4189
4190                 { &hf_isup_backw_call_echo_control_device_ind,
4191                         { "Echo Control Device Indicator",  "isup.backw_call_echo_control_device_indicator",
4192                         FT_BOOLEAN, 16, TFS(&isup_echo_control_device_ind_value), N_16BIT_MASK,
4193                         "", HFILL }},
4194
4195                 { &hf_isup_backw_call_sccp_method_ind,
4196                         { "SCCP method indicator",  "isup.backw_call_sccp_method_indicator",
4197                         FT_UINT16, BASE_HEX, VALS(isup_SCCP_method_ind_value), PO_16BIT_MASK,
4198                         "", HFILL }},
4199                                                         
4200                 { &hf_isup_suspend_resume_indicator,
4201                         { "Suspend/Resume indicator",  "isup.suspend_resume_indicator",
4202                         FT_BOOLEAN, 8, TFS(&isup_suspend_resume_ind_value), A_8BIT_MASK,
4203                         "", HFILL }},
4204                                         
4205                 { &hf_isup_transmission_medium_requirement,
4206                         { "Transmission medium requirement",  "isup.transmission_medium_requirement",
4207                         FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_value), 0x0,
4208                         "", HFILL }},
4209
4210                 { &hf_isup_range_indicator,
4211                         { "Range indicator",  "isup.range_indicator",
4212                           FT_UINT8, BASE_DEC, NULL , 0x0,
4213                           "", HFILL }},
4214
4215                 { &hf_isup_cgs_message_type,
4216                         { "Circuit group supervision message type",  "isup.cgs_message_type",
4217                         FT_UINT8, BASE_DEC, VALS(isup_cgs_message_type_value), BA_8BIT_MASK,
4218                         "", HFILL }},
4219
4220                 { &hf_isup_mtc_blocking_state1,
4221                         { "Maintenance blocking state",  "isup.mtc_blocking_state",
4222                         FT_UINT8, BASE_DEC, VALS(isup_mtc_blocking_state_DC00_value), BA_8BIT_MASK,
4223                         "", HFILL }},
4224
4225                 { &hf_isup_mtc_blocking_state2,
4226                         { "Maintenance blocking state",  "isup.mtc_blocking_state",
4227                         FT_UINT8, BASE_DEC, VALS(isup_mtc_blocking_state_DCnot00_value), BA_8BIT_MASK,
4228                         "", HFILL }},
4229         
4230                 { &hf_isup_call_proc_state,
4231                         { "Call processing state",  "isup.call_processing_state",
4232                         FT_UINT8, BASE_DEC, VALS(isup_call_processing_state_value), DC_8BIT_MASK,
4233                         "", HFILL }},
4234         
4235                 { &hf_isup_hw_blocking_state,
4236                         { "HW blocking state",  "isup.hw_blocking_state",
4237                         FT_UINT8, BASE_DEC, VALS(isup_HW_blocking_state_value), FE_8BIT_MASK,
4238                         "", HFILL }},
4239                                                         
4240                 { &hf_isup_event_ind,
4241                         { "Event indicator",  "isup.event_ind",
4242                           FT_UINT8, 8, NULL, 0x0,
4243                         "", HFILL }},
4244
4245                 { &hf_isup_event_presentation_restricted_ind,
4246                         { "Event presentation restricted indicator",  "isup.event_presentatiation_restr_ind",
4247                         FT_BOOLEAN, 8, TFS(&isup_event_presentation_restricted_ind_value), H_8BIT_MASK,
4248                         "", HFILL }},
4249
4250                 { &hf_isup_cug_call_ind,
4251                         { "Closed user group call indicator",  "isup.clg_call_ind",
4252                         FT_UINT8, BASE_DEC, VALS(isup_CUG_call_ind_value), BA_8BIT_MASK,
4253                         "", HFILL }},
4254
4255                 { &hf_isup_simple_segmentation_ind,
4256                         { "Simple segmentation indicator",  "isup.simple_segmentation_ind",
4257                         FT_BOOLEAN, 8, TFS(&isup_simple_segmentation_ind_value), C_8BIT_MASK,
4258                         "", HFILL }},
4259
4260                 { &hf_isup_connected_line_identity_request_ind,
4261                         { "Connected line identity request indicator",  "isup.connected_line_identity_request_ind",
4262                         FT_BOOLEAN, 8, TFS(&isup_connected_line_identity_request_ind_value), H_8BIT_MASK,
4263                         "", HFILL }},
4264
4265                 { &hf_isup_redirecting_ind,
4266                         { "Redirection indicator",  "isup.redirecting_ind",
4267                         FT_UINT16, BASE_DEC, VALS(isup_redirecting_ind_value), CBA_16BIT_MASK,
4268                         "", HFILL }},
4269
4270                 { &hf_isup_original_redirection_reason,
4271                         { "Original redirection reason",  "isup.original_redirection_reason",
4272                         FT_UINT16, BASE_DEC, VALS(isup_original_redirection_reason_value), HGFE_16BIT_MASK,
4273                         "", HFILL }},
4274
4275                 { &hf_isup_redirection_counter,
4276                         { "Redirection counter",  "isup.redirection_counter",
4277                         FT_UINT16, BASE_DEC, NULL, KJI_16BIT_MASK,
4278                         "", HFILL }},
4279
4280                 { &hf_isup_redirection_reason,
4281                         { "Redirection reason",  "isup.redirection_reason",
4282                         FT_UINT16, BASE_DEC, VALS(isup_redirection_reason_value), PONM_16BIT_MASK,
4283                         "", HFILL }},
4284
4285                 { &hf_isup_type_of_network_identification,
4286                         { "Type of network identification",  "isup.type_of_network_identification",
4287                         FT_UINT8, BASE_DEC, VALS(isup_type_of_network_identification_value), GFE_8BIT_MASK,
4288                         "", HFILL }},
4289
4290                 { &hf_isup_network_identification_plan,
4291                         { "Network identification plan",  "isup.network_identification_plan",
4292                         FT_UINT8, BASE_DEC, VALS(isup_network_identification_plan_value), DCBA_8BIT_MASK,
4293                         "", HFILL }},                                   
4294
4295                 { &hf_isup_map_type,
4296                         { "Map Type",  "isup.map_type",
4297                         FT_UINT8, BASE_DEC, VALS(isup_map_type_value), FEDCBA_8BIT_MASK,
4298                         "", HFILL }},
4299         
4300                 { &hf_isup_automatic_congestion_level,
4301                         { "Automatic congestion level",  "isup.automatic_congestion_level",
4302                         FT_UINT8, BASE_DEC, VALS(isup_auto_congestion_level_value), 0x0,
4303                         "", HFILL }},
4304
4305                 { &hf_isup_inband_information_ind,
4306                         { "In-band information indicator",  "isup.inband_information_ind",
4307                         FT_BOOLEAN, 8, TFS(&isup_inband_information_ind_value), A_8BIT_MASK,
4308                         "", HFILL }},
4309
4310                 { &hf_isup_call_diversion_may_occur_ind,
4311                         { "Call diversion may occur indicator",  "isup.call_diversion_may_occur_ind",
4312                         FT_BOOLEAN, 8, TFS(&isup_call_diversion_may_occur_ind_value), B_8BIT_MASK,
4313                         "", HFILL }},
4314
4315                 { &hf_isup_mlpp_user_ind,
4316                         { "MLPP user indicator",  "isup.mlpp_user",
4317                         FT_BOOLEAN, 8, TFS(&isup_MLPP_user_ind_value), D_8BIT_MASK,
4318                         "", HFILL }},
4319                         
4320                 { &hf_isup_access_delivery_ind,
4321                         { "Access delivery indicator",  "isup.access_delivery_ind",
4322                         FT_BOOLEAN, 8, TFS(&isup_access_delivery_ind_value), A_8BIT_MASK,
4323                         "", HFILL }},
4324                 
4325                 { &hf_isup_transmission_medium_requirement_prime,
4326                         { "Transmission medium requirement prime",  "isup.transmission_medium_requirement_prime",
4327                         FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_prime_value), 0x0,
4328                         "", HFILL }},
4329                 
4330                 { &hf_isup_loop_prevention_response_ind,
4331                         { "Response indicator",  "isup.loop_prevention_response_ind",
4332                         FT_UINT8, BASE_DEC, VALS(isup_loop_prevention_response_ind_value), CB_8BIT_MASK,
4333                         "", HFILL }},
4334                         
4335                 { &hf_isup_temporary_alternative_routing_ind,
4336                         { "Temporary alternative routing indicator",  "isup.temporary_alternative_routing_ind",
4337                         FT_BOOLEAN, 8, TFS(&isup_temporary_alternative_routing_ind_value), A_8BIT_MASK,
4338                         "", HFILL }},
4339                                 
4340                 { &hf_isup_extension_ind,
4341                         { "Extension indicator",  "isup.extension_ind",
4342                         FT_BOOLEAN, 8, TFS(&isup_extension_ind_value), H_8BIT_MASK,
4343                         "", HFILL }},
4344
4345                 { &hf_isup_call_to_be_diverted_ind,
4346                         { "Call to be diverted indicator",  "isup.call_to_be_diverted_ind",
4347                         FT_UINT8, BASE_DEC, VALS(isup_call_to_be_diverted_ind_value), BA_8BIT_MASK,
4348                         "", HFILL }},
4349                         
4350                 { &hf_isup_call_to_be_offered_ind,
4351                         { "Call to be offered indicator",  "isup.call_to_be_offered_ind",
4352                         FT_UINT8, BASE_DEC, VALS(isup_call_to_be_offered_ind_value), BA_8BIT_MASK,
4353                         "", HFILL }},           
4354                         
4355                 { &hf_isup_conference_acceptance_ind,
4356                         { "Conference acceptance indicator",  "isup.conference_acceptance_ind",
4357                         FT_UINT8, BASE_DEC, VALS(isup_conference_acceptance_ind_value), BA_8BIT_MASK,
4358                         "", HFILL }},
4359         };
4360
4361 /* Setup protocol subtree array */
4362         static gint *ett[] = {
4363                 &ett_isup,
4364                 &ett_isup_parameter,
4365                 &ett_isup_address_digits,
4366                 &ett_isup_pass_along_message,
4367                 &ett_isup_circuit_state_ind
4368         };
4369
4370 /* Register the protocol name and description */
4371         proto_isup = proto_register_protocol("ISDN User Part",
4372             "ISUP", "isup");
4373
4374 /* Required function calls to register the header fields and subtrees used */
4375         proto_register_field_array(proto_isup, hf, array_length(hf));
4376         proto_register_subtree_array(ett, array_length(ett));
4377 }
4378
4379
4380 /* ------------------------------------------------------------------ */
4381 /* Register isup with the sub-laying MTP L3 dissector */
4382 void
4383 proto_reg_handoff_isup(void)
4384 {
4385   dissector_handle_t isup_handle;
4386
4387   isup_handle = create_dissector_handle(dissect_isup, proto_isup);
4388   dissector_add("mtp3.service_indicator", MTP3_ISUP_SERVICE_INDICATOR, isup_handle);
4389   dissector_add("m3ua.protocol_data_si", MTP3_ISUP_SERVICE_INDICATOR, isup_handle);
4390 }