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