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