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