Pull much of the processing done after a call to "fragment_add_check()"
[obnox/wireshark/wip.git] / packet-isup.c
1 /* packet-isup.c
2  * Routines for ISUP dissection
3  * Copyright 2001, Martina Obermeier <martina.obermeier@icn.siemens.de>
4  *
5  * $Id: packet-isup.c,v 1.21 2003/04/19 20:13:22 tuexen 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 void
2361 dissect_isup_parameter_compatibility_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2362 {
2363   guint length = tvb_length(parameter_tvb);
2364   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Parameter compatibility information (refer to 3.41/Q.763 for detailed decoding)");
2365   proto_item_set_text(parameter_item, "Parameter compatibility information (%u byte%s length)", length , plurality(length, "", "s"));
2366 }
2367 /* ------------------------------------------------------------------
2368   Dissector Parameter MLPP precedence
2369  */
2370 static void
2371 dissect_isup_mlpp_precedence_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2372 {
2373   char NI_digits[5]="";
2374   guint8 indicators, digit_pair;
2375   guint32 bin_code;
2376
2377   indicators = tvb_get_guint8(parameter_tvb, 0);
2378   proto_tree_add_text(parameter_tree, parameter_tvb, 0, 1, "LFB (Bits 6+7) and precedence level (Bits 1-4): 0x%x",indicators);
2379   digit_pair = tvb_get_guint8(parameter_tvb, 1);
2380   NI_digits[0] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
2381   NI_digits[1] = number_to_char(digit_pair & DCBA_8BIT_MASK);
2382   digit_pair = tvb_get_guint8(parameter_tvb, 2);
2383   NI_digits[2] = number_to_char((digit_pair & HGFE_8BIT_MASK) / 0x10);
2384   NI_digits[3] = number_to_char(digit_pair & DCBA_8BIT_MASK);
2385   NI_digits[4] = '\0';
2386   proto_tree_add_text(parameter_tree, parameter_tvb, 1, 2, "Network Identity: %s", NI_digits);
2387   bin_code = tvb_get_ntoh24(parameter_tvb, 3);
2388   proto_tree_add_text(parameter_tree, parameter_tvb, 3, 3, "MLPP service domain: 0x%x", bin_code);
2389   proto_item_set_text(parameter_item, "MLPP precedence: NI = %s, MLPP service domain = 0x%x", NI_digits, bin_code);
2390 }
2391 /* ------------------------------------------------------------------
2392   Dissector Parameter MCID request indicators
2393  */
2394 static void
2395 dissect_isup_mcid_request_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2396 { guint8 indicator;
2397
2398   indicator = tvb_get_guint8(parameter_tvb, 0);
2399   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);
2400   proto_item_set_text(parameter_item, "MCID request indicators: 0x%x", indicator);
2401 }
2402 /* ------------------------------------------------------------------
2403   Dissector Parameter MCID response indicators
2404  */
2405 static void
2406 dissect_isup_mcid_response_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2407 { guint8 indicator;
2408
2409   indicator = tvb_get_guint8(parameter_tvb, 0);
2410   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);
2411   proto_item_set_text(parameter_item, "MCID response indicators: 0x%x", indicator);
2412 }
2413 /* ------------------------------------------------------------------
2414   Dissector Parameter Hop counter
2415  */
2416 static void
2417 dissect_isup_hop_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2418 { guint8 counter;
2419
2420   counter = tvb_get_guint8(parameter_tvb, 0) & EDCBA_8BIT_MASK; /* since bits H,G and F are spare */
2421   proto_tree_add_text(parameter_tree, parameter_tvb, 0, HOP_COUNTER_LENGTH, "Hop counter: %u", counter);
2422   proto_item_set_text(parameter_item,  "Hop counter: %u", counter);
2423 }
2424 /* ------------------------------------------------------------------
2425   Dissector Parameter Transmission medium requirement prime
2426  */
2427 static void
2428 dissect_isup_transmission_medium_requirement_prime_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2429 {
2430   guint8 transmission_medium_requirement;
2431
2432   transmission_medium_requirement = tvb_get_guint8(parameter_tvb, 0);
2433   proto_tree_add_uint(parameter_tree, hf_isup_transmission_medium_requirement_prime, parameter_tvb, 0, TRANSMISSION_MEDIUM_RQMT_PRIME_LENGTH,transmission_medium_requirement);
2434
2435   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"));
2436 }
2437
2438 /* ------------------------------------------------------------------
2439   Dissector Parameter location number
2440  */
2441 static void
2442 dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2443 {
2444   proto_item *address_digits_item;
2445   proto_tree *address_digits_tree;
2446   guint8 indicators1, indicators2;
2447   guint8 address_digit_pair=0;
2448   gint offset=0;
2449   gint i=0;
2450   gint length;
2451   char calling_number[MAXLENGTH]="";
2452
2453   indicators1 = tvb_get_guint8(parameter_tvb, 0);
2454   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
2455   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2456   indicators2 = tvb_get_guint8(parameter_tvb, 1);
2457   proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
2458   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
2459   if ((indicators2 & GFE_8BIT_MASK) == 0x50)
2460     proto_tree_add_text(parameter_tree, parameter_tvb, 1, 1, "Different meaning for Location Number: Numbering plan indicator = private numbering plan");
2461   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
2462   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
2463   offset = 2;
2464
2465   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2466                                             offset, -1,
2467                                             "Location number");
2468   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2469
2470   length = tvb_length_remaining(parameter_tvb, offset);
2471   while(length > 0){
2472     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2473     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2474     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2475     if ((length - 1) > 0 ){
2476       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2477       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2478     }
2479     offset++;
2480     length = tvb_length_remaining(parameter_tvb, offset);
2481   }
2482
2483   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2484       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2485       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2486   }
2487   calling_number[i++] = '\0';
2488
2489   proto_item_set_text(address_digits_item, "Location number: %s", calling_number);
2490   proto_item_set_text(parameter_item, "Location number: %s", calling_number);
2491
2492 }
2493 /* ------------------------------------------------------------------
2494   Dissector Parameter Redirection number restiriction
2495  */
2496 static void
2497 dissect_isup_redirection_number_restriction_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2498 {
2499   guint8 indicator;
2500
2501   indicator = tvb_get_guint8(parameter_tvb, 0);
2502   switch (indicator & BA_8BIT_MASK) {
2503   case 0:
2504     proto_tree_add_text(parameter_tree, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: Presentation allowed");
2505     break;
2506   case 1:
2507     proto_tree_add_text(parameter_tree, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: Presentation restricted");
2508     break;
2509   default:
2510     proto_tree_add_text(parameter_tree, parameter_tvb, 0, REDIRECTION_NUMBER_RESTRICTION_LENGTH, "Presentation indicator: spare");
2511     break;
2512   }
2513   proto_item_set_text(parameter_item, "Redirection number restriction: 0x%x ", indicator);
2514 }
2515 /* ------------------------------------------------------------------
2516   Dissector Parameter Call transfer identity
2517  */
2518 static void
2519 dissect_isup_call_transfer_reference_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2520 { guint8 id;
2521
2522   id = tvb_get_guint8(parameter_tvb, 0);
2523   proto_tree_add_text(parameter_tree, parameter_tvb, 0, CALL_TRANSFER_REF_LENGTH, "Call transfer identity: %u", id);
2524   proto_item_set_text(parameter_item,  "Call transfer reference: %u", id);
2525 }
2526 /* ------------------------------------------------------------------
2527   Dissector Parameter Loop prevention
2528  */
2529 static void
2530 dissect_isup_loop_prevention_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2531 {
2532   guint8 indicator;
2533
2534   indicator = tvb_get_guint8(parameter_tvb, 0);
2535   if ((indicator & A_8BIT_MASK)==0) {
2536     proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "Type: Request");
2537     proto_item_set_text(parameter_item, "Loop prevention indicators: Request (%u)", indicator);
2538   }
2539   else {
2540     proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "Type: Response");
2541     proto_tree_add_uint(parameter_tree, hf_isup_loop_prevention_response_ind, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, indicator);
2542     proto_item_set_text(parameter_item, "Loop prevention indicators: Response (%u)", indicator);
2543   }
2544 }
2545 /* ------------------------------------------------------------------
2546   Dissector Parameter Call transfer number
2547  */
2548 static void
2549 dissect_isup_call_transfer_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2550 {
2551   proto_item *address_digits_item;
2552   proto_tree *address_digits_tree;
2553   guint8 indicators1, indicators2;
2554   guint8 address_digit_pair=0;
2555   gint offset=0;
2556   gint i=0;
2557   gint length;
2558   char calling_number[MAXLENGTH]="";
2559
2560   indicators1 = tvb_get_guint8(parameter_tvb, 0);
2561   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
2562   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2563   indicators2 = tvb_get_guint8(parameter_tvb, 1);
2564   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
2565   if ((indicators2 & GFE_8BIT_MASK) == 0x50)
2566     proto_tree_add_text(parameter_tree, parameter_tvb, 1, 1, "Different meaning for Call Transfer Number: Numbering plan indicator = private numbering plan");
2567   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
2568   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 1, 1, indicators2);
2569   offset = 2;
2570
2571   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2572                                             offset, -1,
2573                                             "Call transfer number");
2574   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2575
2576   length = tvb_length_remaining(parameter_tvb, offset);
2577   while(length > 0){
2578     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2579     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2580     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2581     if ((length - 1) > 0 ){
2582       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2583       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2584     }
2585     offset++;
2586     length = tvb_length_remaining(parameter_tvb, offset);
2587   }
2588
2589   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2590       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2591       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2592   }
2593   calling_number[i++] = '\0';
2594
2595   proto_item_set_text(address_digits_item, "Call transfer number: %s", calling_number);
2596   proto_item_set_text(parameter_item, "Call transfer number: %s", calling_number);
2597
2598 }
2599 /* ------------------------------------------------------------------
2600   Dissector Parameter CCSS
2601  */
2602 static void
2603 dissect_isup_ccss_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2604 {
2605   guint8 indicator;
2606
2607   indicator = tvb_get_guint8(parameter_tvb, 0);
2608   if ((indicator & A_8BIT_MASK)==0) {
2609     proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "CCSS call indicator: no indication");
2610     proto_item_set_text(parameter_item, "CCSS call indicator: no indication (%u)", indicator);
2611   }
2612   else {
2613     proto_tree_add_text(parameter_tree, parameter_tvb, 0, LOOP_PREVENTION_IND_LENGTH, "CCSS call indicator: CCSS call");
2614     proto_item_set_text(parameter_item, "CCSS call indicator: CCSS call (%u)", indicator);
2615   }
2616 }
2617 /* ------------------------------------------------------------------
2618  Parameter Forward GVNS
2619  */
2620 static void
2621 dissect_isup_forward_gvns_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2622 { guint length = tvb_length(parameter_tvb);
2623   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Forward GVNS (refer to 3.66/Q.763 for detailed decoding)");
2624   proto_item_set_text(parameter_item, "Forward GVNS (%u Byte%s)", length , plurality(length, "", "s"));
2625 }
2626 /* ------------------------------------------------------------------
2627  Parameter Redirect capability
2628  */
2629 static void
2630 dissect_isup_redirect_capability_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2631 { guint length = tvb_length(parameter_tvb);
2632   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Redirect capability (format is a national matter)");
2633   proto_item_set_text(parameter_item, "Redirect Capability (%u Byte%s)", length , plurality(length, "", "s"));
2634 }
2635 /* ------------------------------------------------------------------
2636   Dissector Parameter Backward GVNS
2637  */
2638 static void
2639 dissect_isup_backward_gvns_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2640 { guint8 indicator;
2641
2642   indicator = tvb_get_guint8(parameter_tvb, 0);
2643   proto_tree_add_text(parameter_tree, parameter_tvb, 0, BACKWARD_GVNS_LENGTH, "Backward GVNS: 0x%x (refer to 3.62/Q.763 for detailed decoding)", indicator);
2644   proto_item_set_text(parameter_item, "Backward GVNS: 0x%x", indicator);
2645 }
2646 /* ------------------------------------------------------------------
2647   Dissector Parameter Network management controls
2648  */
2649 static void
2650 dissect_isup_network_management_controls_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2651 { guint8 indicator;
2652
2653   indicator = tvb_get_guint8(parameter_tvb, 0);
2654   proto_tree_add_boolean(parameter_tree, hf_isup_temporary_alternative_routing_ind, parameter_tvb, 0,NETWORK_MANAGEMENT_CONTROLS_LENGTH, indicator);
2655   proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0,NETWORK_MANAGEMENT_CONTROLS_LENGTH, indicator);
2656   proto_item_set_text(parameter_item, "Network management controls: 0x%x", indicator);
2657 }
2658 /* ------------------------------------------------------------------
2659   Dissector Parameter Correlation id - no detailed dissection since defined in Rec. Q.1281
2660  */
2661 static void
2662 dissect_isup_correlation_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2663 { guint length = tvb_length(parameter_tvb);
2664   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Correlation ID (-> Q.1281)");
2665   proto_item_set_text(parameter_item, "Correlation ID, see Q.1281 (%u Byte%s)", length , plurality(length, "", "s"));
2666 }
2667 /* ------------------------------------------------------------------
2668   Dissector Parameter SCF id - no detailed dissection since defined in Rec. Q.1281
2669  */
2670 static void
2671 dissect_isup_scf_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2672 { guint length = tvb_length(parameter_tvb);
2673   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "SCF ID (-> Q.1281)");
2674   proto_item_set_text(parameter_item, "SCF ID, see Q.1281 (%u Byte%s)", length , plurality(length, "", "s"));
2675 }
2676 /* ------------------------------------------------------------------
2677   Dissector Parameter Call diversion treatment indicators
2678  */
2679 static void
2680 dissect_isup_call_diversion_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2681 { guint8 indicator;
2682
2683   indicator = tvb_get_guint8(parameter_tvb, 0);
2684   proto_tree_add_uint(parameter_tree, hf_isup_call_to_be_diverted_ind, parameter_tvb, 0,CALL_DIV_TREATMENT_IND_LENGTH, indicator);
2685   proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CALL_DIV_TREATMENT_IND_LENGTH, indicator);
2686   proto_item_set_text(parameter_item, "Call diversion treatment indicators: 0x%x", indicator);
2687 }
2688 /* ------------------------------------------------------------------
2689   Dissector Parameter called IN  number
2690  */
2691 static void
2692 dissect_isup_called_in_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2693 {
2694   proto_item *address_digits_item;
2695   proto_tree *address_digits_tree;
2696   guint8 indicators1, indicators2;
2697   guint8 address_digit_pair=0;
2698   gint offset=0;
2699   gint i=0;
2700   gint length;
2701   char calling_number[MAXLENGTH]="";
2702
2703   indicators1 = tvb_get_guint8(parameter_tvb, 0);
2704   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
2705   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2706   indicators2 = tvb_get_guint8(parameter_tvb, 1);
2707   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
2708   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
2709   offset = 2;
2710
2711   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2712                                             offset, -1,
2713                                             "Called IN Number");
2714   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2715
2716   length = tvb_length_remaining(parameter_tvb, offset);
2717   while(length > 0){
2718     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2719     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2720     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2721     if ((length - 1) > 0 ){
2722       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2723       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2724     }
2725     offset++;
2726     length = tvb_length_remaining(parameter_tvb, offset);
2727   }
2728
2729   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2730       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2731       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2732   }
2733   calling_number[i++] = '\0';
2734
2735   proto_item_set_text(address_digits_item, "Called IN Number: %s", calling_number);
2736   proto_item_set_text(parameter_item, "Called IN Number: %s", calling_number);
2737
2738 }
2739 /* ------------------------------------------------------------------
2740   Dissector Parameter Call offering treatment indicators
2741  */
2742 static void
2743 dissect_isup_call_offering_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2744 { guint8 indicator;
2745
2746   indicator = tvb_get_guint8(parameter_tvb, 0);
2747   proto_tree_add_uint(parameter_tree, hf_isup_call_to_be_offered_ind, parameter_tvb, 0,CALL_OFFERING_TREATMENT_IND_LENGTH, indicator);
2748   proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CALL_OFFERING_TREATMENT_IND_LENGTH, indicator);
2749   proto_item_set_text(parameter_item, "Call offering treatment indicators: 0x%x", indicator);
2750 }
2751 /* ------------------------------------------------------------------
2752  Parameter Charged party identification
2753  */
2754 static void
2755 dissect_isup_charged_party_identification_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2756 { guint length = tvb_length(parameter_tvb);
2757   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Charged party identification (format is national network specific)");
2758   proto_item_set_text(parameter_item, "Charged party identification (%u Byte%s)", length , plurality(length, "", "s"));
2759 }
2760 /* ------------------------------------------------------------------
2761   Dissector Parameter Conference treatment indicators
2762  */
2763 static void
2764 dissect_isup_conference_treatment_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2765 { guint8 indicator;
2766
2767   indicator = tvb_get_guint8(parameter_tvb, 0);
2768   proto_tree_add_uint(parameter_tree, hf_isup_conference_acceptance_ind, parameter_tvb, 0,CONFERENCE_TREATMENT_IND_LENGTH, indicator);
2769   proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CONFERENCE_TREATMENT_IND_LENGTH, indicator);
2770   proto_item_set_text(parameter_item, "Conference treatment indicators: 0x%x", indicator);
2771 }
2772 /* ------------------------------------------------------------------
2773   Dissector Parameter Display information
2774  */
2775 static void
2776 dissect_isup_display_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2777 { guint length = tvb_length(parameter_tvb);
2778   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Display information (-> Q.931)");
2779   proto_item_set_text(parameter_item, "Display information (%u Byte%s)", length , plurality(length, "", "s"));
2780 }
2781 /* ------------------------------------------------------------------
2782  Parameter UID action indicators
2783  */
2784 static void
2785 dissect_isup_uid_action_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2786 { guint8 indicator;
2787
2788   indicator = tvb_get_guint8(parameter_tvb, 0);
2789   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);
2790   proto_item_set_text(parameter_item, "UID action indicators: 0x%x", indicator);
2791 }
2792 /* ------------------------------------------------------------------
2793  Parameter UID capability indicators
2794  */
2795 static void
2796 dissect_isup_uid_capability_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2797 { guint8 indicator;
2798
2799   indicator = tvb_get_guint8(parameter_tvb, 0);
2800   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);
2801   proto_item_set_text(parameter_item, "UID capability indicators: 0x%x", indicator);
2802 }
2803 /* ------------------------------------------------------------------
2804  Parameter Redirect counter
2805  */
2806 static void
2807 dissect_isup_redirect_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2808 { guint length = tvb_length(parameter_tvb);
2809   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Redirect counter (format is a national matter)");
2810   proto_item_set_text(parameter_item, "Redirect counter (%u Byte%s)", length , plurality(length, "", "s"));
2811 }
2812 /* ------------------------------------------------------------------
2813   Dissector Parameter Collect call request
2814  */
2815 static void
2816 dissect_isup_collect_call_request_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2817 { guint8 indicator;
2818
2819   indicator = tvb_get_guint8(parameter_tvb, 0);
2820   if ((indicator & A_8BIT_MASK) == 0) {
2821     proto_tree_add_text(parameter_tree, parameter_tvb, 0, COLLECT_CALL_REQUEST_LENGTH, "Collect call request indicator: no indication");
2822     proto_item_set_text(parameter_item, "Collect call reqeust: no indication (0x%x)", indicator);
2823   }
2824   else {
2825     proto_tree_add_text(parameter_tree, parameter_tvb, 0, COLLECT_CALL_REQUEST_LENGTH, "Collect call request indicator: collect call requested");
2826     proto_item_set_text(parameter_item, "Collect call reqeust: collect call requested (0x%x)", indicator);
2827   }
2828 }
2829 /* ------------------------------------------------------------------
2830   Dissector Parameter Generic number
2831  */
2832 static void
2833 dissect_isup_generic_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2834 {
2835   proto_item *address_digits_item;
2836   proto_tree *address_digits_tree;
2837   guint8 indicators1, indicators2, nr_qualifier_ind;
2838   guint8 address_digit_pair=0;
2839   gint offset=0;
2840   gint i=0;
2841   gint length;
2842   char calling_number[MAXLENGTH]="";
2843
2844   nr_qualifier_ind = tvb_get_guint8(parameter_tvb, 0);
2845   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);
2846   indicators1 = tvb_get_guint8(parameter_tvb, 1);
2847   proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 1, 1, indicators1);
2848   proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
2849   indicators2 = tvb_get_guint8(parameter_tvb, 2);
2850   proto_tree_add_boolean(parameter_tree, hf_isup_ni_indicator, parameter_tvb, 2, 1, indicators2);
2851   proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 2, 1, indicators2);
2852   if ((indicators2 & GFE_8BIT_MASK) == 0x50)
2853     proto_tree_add_text(parameter_tree, parameter_tvb, 2, 1, "Different meaning for Generic Number: Numbering plan indicator = private numbering plan");
2854   proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 2, 1, indicators2);
2855   proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 2, 1, indicators2);
2856   offset = 3;
2857
2858   address_digits_item = proto_tree_add_text(parameter_tree, parameter_tvb,
2859                                             offset, -1,
2860                                             "Generic number");
2861   address_digits_tree = proto_item_add_subtree(address_digits_item, ett_isup_address_digits);
2862
2863   length = tvb_length_remaining(parameter_tvb, offset);
2864   while(length > 0){
2865     address_digit_pair = tvb_get_guint8(parameter_tvb, offset);
2866     proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2867     calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK);
2868     if ((length - 1) > 0 ){
2869       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset, 1, address_digit_pair);
2870       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2871     }
2872     offset++;
2873     length = tvb_length_remaining(parameter_tvb, offset);
2874   }
2875
2876   if  (((indicators1 & 0x80) == 0) && (tvb_length(parameter_tvb) > 0)){ /* Even Indicator set -> last even digit is valid & has be displayed */
2877       proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair);
2878       calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10);
2879   }
2880   calling_number[i++] = '\0';
2881
2882   proto_item_set_text(address_digits_item, "Generic number: %s", calling_number);
2883   proto_item_set_text(parameter_item, "Generic number: %s", calling_number);
2884
2885 }
2886 /* ------------------------------------------------------------------
2887  Dissector Parameter Generic digits
2888  */
2889 static void
2890 dissect_isup_generic_digits_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
2891 { guint length = tvb_length(parameter_tvb);
2892   proto_tree_add_text(parameter_tree, parameter_tvb, 0, length, "Generic digits (refer to 3.24/Q.673 for detailed decoding)");
2893   proto_item_set_text(parameter_item, "Generic digits (%u Byte%s)", length , plurality(length, "", "s"));
2894 }
2895 /* ------------------------------------------------------------------ */
2896 static void
2897 dissect_isup_unknown_parameter(tvbuff_t *parameter_tvb, proto_item *parameter_item)
2898 { guint length = tvb_length(parameter_tvb);
2899   proto_item_set_text(parameter_item, "Parameter Type unknown/reserved (%u Byte%s)", length , plurality(length, "", "s"));
2900 }
2901 /* ------------------------------------------------------------------ */
2902
2903 /* ------------------------------------------------------------------
2904   Dissector all optional parameters
2905 */
2906 static void
2907 dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, proto_tree *isup_tree)
2908 { proto_item* parameter_item;
2909   proto_tree* parameter_tree;
2910   gint offset = 0;
2911   guint parameter_type, parameter_length, actual_length;
2912   tvbuff_t *parameter_tvb;
2913
2914   /* Dissect all optional parameters while end of message isn't reached */
2915   parameter_type = 0xFF; /* Start-initializiation since parameter_type is used for while-condition */
2916
2917   while ((tvb_length_remaining(optional_parameters_tvb, offset)  >= 1) && (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS)){
2918     parameter_type = tvb_get_guint8(optional_parameters_tvb, offset);
2919
2920     if (parameter_type != PARAM_TYPE_END_OF_OPT_PARAMS){
2921       parameter_length = tvb_get_guint8(optional_parameters_tvb, offset + PARAMETER_TYPE_LENGTH);
2922
2923       parameter_item = proto_tree_add_text(isup_tree, optional_parameters_tvb,
2924                                            offset,
2925                                            parameter_length  + PARAMETER_TYPE_LENGTH + PARAMETER_LENGTH_IND_LENGTH,
2926                                            "Parameter: type %u",
2927                                            parameter_type);
2928       parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
2929       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"));
2930       offset += PARAMETER_TYPE_LENGTH;
2931
2932       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);
2933       offset += PARAMETER_LENGTH_IND_LENGTH;
2934
2935       actual_length = tvb_length_remaining(optional_parameters_tvb, offset);
2936       if (actual_length > 0){
2937         parameter_tvb = tvb_new_subset(optional_parameters_tvb, offset, MIN(parameter_length, actual_length), parameter_length);
2938         switch (parameter_type) {
2939         case PARAM_TYPE_CALL_REF:
2940           dissect_isup_call_reference_parameter(parameter_tvb, parameter_tree, parameter_item);
2941           break;
2942         case PARAM_TYPE_TRANSM_MEDIUM_REQU:
2943           dissect_isup_transmission_medium_requirement_parameter(parameter_tvb, parameter_tree, parameter_item);
2944           break;
2945         case PARAM_TYPE_ACC_TRANSP:
2946           dissect_isup_access_transport_parameter(parameter_tvb, parameter_tree, parameter_item);
2947           break;
2948         case PARAM_TYPE_CALLED_PARTY_NR:
2949           dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2950           break;
2951         case PARAM_TYPE_SUBSQT_NR:
2952           dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2953           break;
2954         case PARAM_TYPE_NATURE_OF_CONN_IND:
2955           dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2956           break;
2957         case PARAM_TYPE_FORW_CALL_IND:
2958           dissect_isup_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2959           break;
2960         case PARAM_TYPE_OPT_FORW_CALL_IND:
2961           dissect_isup_optional_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2962           break;
2963         case PARAM_TYPE_CALLING_PRTY_CATEG:
2964           dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item);
2965           break;
2966         case PARAM_TYPE_CALLING_PARTY_NR:
2967           dissect_isup_calling_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2968           break;
2969         case PARAM_TYPE_REDIRECTING_NR:
2970           dissect_isup_redirecting_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2971           break;
2972         case PARAM_TYPE_REDIRECTION_NR:
2973           dissect_isup_redirection_number_parameter(parameter_tvb, parameter_tree, parameter_item);
2974           break;
2975         case PARAM_TYPE_CONNECTION_REQ:
2976           dissect_isup_connection_request_parameter(parameter_tvb, parameter_tree, parameter_item);
2977           break;
2978         case PARAM_TYPE_INFO_REQ_IND:
2979           dissect_isup_information_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2980           break;
2981         case PARAM_TYPE_INFO_IND:
2982           dissect_isup_information_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2983           break;
2984         case PARAM_TYPE_CONTINUITY_IND:
2985           dissect_isup_continuity_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2986           break;
2987         case PARAM_TYPE_BACKW_CALL_IND:
2988           dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2989           break;
2990         case PARAM_TYPE_CAUSE_INDICATORS:
2991           dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
2992           break;
2993         case PARAM_TYPE_REDIRECTION_INFO:
2994           dissect_isup_redirection_information_parameter(parameter_tvb, parameter_tree, parameter_item);
2995           break;
2996         case PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE:
2997           dissect_isup_circuit_group_supervision_message_type_parameter(parameter_tvb, parameter_tree, parameter_item);
2998           break;
2999         case PARAM_TYPE_RANGE_AND_STATUS:
3000           dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3001           break;
3002         case PARAM_TYPE_FACILITY_IND:
3003           dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
3004           break;
3005         case PARAM_TYPE_CLSD_USR_GRP_ILOCK_CD:
3006           dissect_isup_closed_user_group_interlock_code_parameter(parameter_tvb, parameter_tree, parameter_item);
3007           break;
3008         case PARAM_TYPE_USER_SERVICE_INFO:
3009           dissect_isup_user_service_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3010           break;
3011         case PARAM_TYPE_SIGNALLING_POINT_CODE:
3012           dissect_isup_signalling_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
3013           break;
3014         case PARAM_TYPE_USER_TO_USER_INFO:
3015           dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3016           break;
3017         case PARAM_TYPE_CONNECTED_NR:
3018           dissect_isup_connected_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3019           break;
3020         case PARAM_TYPE_SUSP_RESUME_IND:
3021           dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3022           break;
3023         case PARAM_TYPE_TRANSIT_NETW_SELECT:
3024           dissect_isup_transit_network_selection_parameter(parameter_tvb, parameter_tree, parameter_item);
3025           break;
3026         case PARAM_TYPE_EVENT_INFO:
3027           dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3028           break;
3029         case PARAM_TYPE_CIRC_ASSIGN_MAP:
3030           dissect_isup_circuit_assignment_map_parameter(parameter_tvb, parameter_tree, parameter_item);
3031           break;
3032         case PARAM_TYPE_CIRC_STATE_IND:
3033           dissect_isup_circuit_state_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
3034           break;
3035         case PARAM_TYPE_AUTO_CONG_LEVEL:
3036           dissect_isup_automatic_congestion_level_parameter(parameter_tvb, parameter_tree, parameter_item);
3037           break;
3038         case PARAM_TYPE_ORIG_CALLED_NR:
3039           dissect_isup_original_called_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3040           break;
3041         case PARAM_TYPE_OPT_BACKW_CALL_IND:
3042           dissect_isup_optional_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3043           break;
3044         case PARAM_TYPE_USER_TO_USER_IND:
3045           dissect_isup_user_to_user_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3046           break;
3047         case PARAM_TYPE_ORIG_ISC_POINT_CODE:
3048           dissect_isup_original_isc_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
3049           break;
3050         case PARAM_TYPE_GENERIC_NOTIF_IND:
3051           dissect_isup_generic_notification_indicator_parameter(parameter_tvb, parameter_tree, parameter_item);
3052           break;
3053         case PARAM_TYPE_CALL_HIST_INFO :
3054           dissect_isup_call_history_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3055           break;
3056         case PARAM_TYPE_ACC_DELIV_INFO:
3057           dissect_isup_access_delivery_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3058           break;
3059         case PARAM_TYPE_NETW_SPECIFIC_FACLTY:
3060           dissect_isup_network_specific_facility_parameter(parameter_tvb, parameter_tree, parameter_item);
3061           break;
3062         case PARAM_TYPE_USER_SERVICE_INFO_PR:
3063           dissect_isup_user_service_information_prime_parameter(parameter_tvb, parameter_tree, parameter_item);
3064           break;
3065         case PARAM_TYPE_PROPAG_DELAY_COUNTER:
3066           dissect_isup_propagation_delay_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
3067           break;
3068         case PARAM_TYPE_REMOTE_OPERATIONS:
3069           dissect_isup_remote_operations_parameter(parameter_tvb, parameter_tree, parameter_item);
3070           break;
3071         case PARAM_TYPE_SERVICE_ACTIVATION:
3072           dissect_isup_service_activation_parameter(parameter_tvb, parameter_tree, parameter_item);
3073           break;
3074         case PARAM_TYPE_USER_TELESERV_INFO:
3075           dissect_isup_user_teleservice_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3076           break;
3077         case PARAM_TYPE_TRANSM_MEDIUM_USED:
3078           dissect_isup_transmission_medium_used_parameter(parameter_tvb, parameter_tree, parameter_item);
3079           break;
3080         case PARAM_TYPE_CALL_DIV_INFO:
3081           dissect_isup_call_diversion_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3082           break;
3083         case PARAM_TYPE_ECHO_CTRL_INFO:
3084           dissect_isup_echo_control_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3085           break;
3086         case PARAM_TYPE_MSG_COMPAT_INFO:
3087           dissect_isup_message_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3088           break;
3089         case PARAM_TYPE_PARAM_COMPAT_INFO:
3090           dissect_isup_parameter_compatibility_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3091           break;
3092         case PARAM_TYPE_MLPP_PRECEDENCE:
3093           dissect_isup_mlpp_precedence_parameter(parameter_tvb, parameter_tree, parameter_item);
3094           break;
3095         case PARAM_TYPE_MCID_REQ_IND:
3096           dissect_isup_mcid_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3097           break;
3098         case PARAM_TYPE_MCID_RSP_IND:
3099           dissect_isup_mcid_response_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3100           break;
3101         case PARAM_TYPE_HOP_COUNTER:
3102           dissect_isup_hop_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
3103           break;
3104         case PARAM_TYPE_TRANSM_MEDIUM_RQUR_PR:
3105           dissect_isup_transmission_medium_requirement_prime_parameter(parameter_tvb, parameter_tree, parameter_item);
3106           break;
3107         case PARAM_TYPE_LOCATION_NR:
3108           dissect_isup_location_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3109           break;
3110         case PARAM_TYPE_REDIR_NR_RSTRCT:
3111           dissect_isup_redirection_number_restriction_parameter(parameter_tvb, parameter_tree, parameter_item);
3112           break;
3113         case PARAM_TYPE_CALL_TRANS_REF:
3114           dissect_isup_call_transfer_reference_parameter(parameter_tvb, parameter_tree, parameter_item);
3115           break;
3116         case PARAM_TYPE_LOOP_PREV_IND:
3117           dissect_isup_loop_prevention_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3118           break;
3119         case PARAM_TYPE_CALL_TRANS_NR:
3120           dissect_isup_call_transfer_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3121           break;
3122         case PARAM_TYPE_CCSS:
3123           dissect_isup_ccss_parameter(parameter_tvb, parameter_tree, parameter_item);
3124           break;
3125         case PARAM_TYPE_FORW_GVNS:
3126           dissect_isup_forward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);
3127           break;
3128         case PARAM_TYPE_BACKW_GVNS:
3129           dissect_isup_backward_gvns_parameter(parameter_tvb, parameter_tree, parameter_item);
3130           break;
3131         case PARAM_TYPE_REDIRECT_CAPAB:
3132           dissect_isup_redirect_capability_parameter(parameter_tvb, parameter_tree, parameter_item);
3133           break;
3134         case PARAM_TYPE_NETW_MGMT_CTRL:
3135           dissect_isup_network_management_controls_parameter(parameter_tvb, parameter_tree, parameter_item);
3136           break;
3137         case PARAM_TYPE_CORRELATION_ID:
3138           dissect_isup_correlation_id_parameter(parameter_tvb, parameter_tree, parameter_item);
3139           break;
3140         case PARAM_TYPE_SCF_ID:
3141           dissect_isup_scf_id_parameter(parameter_tvb, parameter_tree, parameter_item);
3142           break;
3143         case PARAM_TYPE_CALL_DIV_TREAT_IND:
3144           dissect_isup_call_diversion_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3145           break;
3146         case PARAM_TYPE_CALLED_IN_NR:
3147           dissect_isup_called_in_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3148           break;
3149         case PARAM_TYPE_CALL_OFF_TREAT_IND:
3150           dissect_isup_call_offering_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3151           break;
3152         case PARAM_TYPE_CHARGED_PARTY_IDENT:
3153           dissect_isup_charged_party_identification_parameter(parameter_tvb, parameter_tree, parameter_item);
3154           break;
3155         case PARAM_TYPE_CONF_TREAT_IND:
3156           dissect_isup_conference_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3157           break;
3158         case PARAM_TYPE_DISPLAY_INFO:
3159           dissect_isup_display_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3160           break;
3161         case PARAM_TYPE_UID_ACTION_IND:
3162           dissect_isup_uid_action_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3163           break;
3164         case PARAM_TYPE_UID_CAPAB_IND:
3165           dissect_isup_uid_capability_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3166           break;
3167         case PARAM_TYPE_REDIRECT_COUNTER:
3168           dissect_isup_redirect_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
3169           break;
3170         case PARAM_TYPE_COLLECT_CALL_REQ:
3171           dissect_isup_collect_call_request_parameter(parameter_tvb, parameter_tree, parameter_item);
3172           break;
3173         case PARAM_TYPE_GENERIC_NR:
3174           dissect_isup_generic_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3175           break;
3176         case PARAM_TYPE_GENERIC_DIGITS:
3177           dissect_isup_generic_digits_parameter(parameter_tvb, parameter_tree, parameter_item);
3178           break;
3179         default:
3180           dissect_isup_unknown_parameter(parameter_tvb, parameter_item);
3181           break;
3182         }
3183         offset += MIN(parameter_length, actual_length);
3184       }
3185
3186     }
3187     else {
3188         /* End of optional parameters is reached */
3189         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);
3190     }
3191   }
3192 }
3193
3194 /* ------------------------------------------------------------------ */
3195 /* Dissectors for all used message types                              */
3196 /* Called by dissect_isup_message(),                                  */
3197 /* call parameter dissectors in order of mandatory parameters         */
3198 /* (since not labeled)                                                */
3199 /* ------------------------------------------------------------------
3200   Dissector Message Type Initial address message
3201  */
3202 gint
3203 dissect_isup_initial_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3204 { proto_item* parameter_item;
3205   proto_tree* parameter_tree;
3206   tvbuff_t *parameter_tvb;
3207   gint offset = 0;
3208   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3209
3210   /* Do stuff for first mandatory fixed parameter: Nature of Connection Indicators */
3211   parameter_type = PARAM_TYPE_NATURE_OF_CONN_IND;
3212   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3213                                        NATURE_OF_CONNECTION_IND_LENGTH,
3214                                        "Nature of Connection Indicators");
3215   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3216   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"));
3217   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3218   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(NATURE_OF_CONNECTION_IND_LENGTH, actual_length), NATURE_OF_CONNECTION_IND_LENGTH);
3219   dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3220   offset += NATURE_OF_CONNECTION_IND_LENGTH;
3221
3222   /* Do stuff for 2nd mandatory fixed parameter: Forward Call Indicators */
3223   parameter_type =  PARAM_TYPE_FORW_CALL_IND;
3224   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3225                                        FORWARD_CALL_IND_LENGTH,
3226                                        "Forward Call Indicators");
3227   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3228   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"));
3229   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3230   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FORWARD_CALL_IND_LENGTH, actual_length), FORWARD_CALL_IND_LENGTH );
3231   dissect_isup_forward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3232   offset +=  FORWARD_CALL_IND_LENGTH;
3233
3234   /* Do stuff for 3nd mandatory fixed parameter: Calling party's category */
3235   parameter_type = PARAM_TYPE_CALLING_PRTY_CATEG;
3236   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3237                                        CALLING_PRTYS_CATEGORY_LENGTH,
3238                                        "Calling Party's category");
3239   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3240   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"));
3241   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3242   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CALLING_PRTYS_CATEGORY_LENGTH, actual_length),CALLING_PRTYS_CATEGORY_LENGTH );
3243   dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item);
3244   offset += CALLING_PRTYS_CATEGORY_LENGTH;
3245
3246   /* Do stuff for 4th mandatory fixed parameter: Transmission medium requirement */
3247   parameter_type = PARAM_TYPE_TRANSM_MEDIUM_REQU;
3248   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3249                                        TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH,
3250                                        "Transmission medium requirement");
3251   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3252   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"));
3253   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3254   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH, actual_length), TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH);
3255   dissect_isup_transmission_medium_requirement_parameter(parameter_tvb, parameter_tree, parameter_item);
3256   offset += TRANSMISSION_MEDIUM_REQUIREMENT_LENGTH;
3257
3258
3259   /* Do stuff for mandatory variable parameter Called party number */
3260   parameter_type = PARAM_TYPE_CALLED_PARTY_NR;
3261   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3262   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3263
3264   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3265                                        offset +  parameter_pointer,
3266                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3267                                        "Called Party Number");
3268   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3269   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"));
3270   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);
3271   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);
3272   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3273   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3274   dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3275   offset += PARAMETER_POINTER_LENGTH;
3276
3277   return offset;
3278 }
3279 /* ------------------------------------------------------------------
3280   Dissector Message Type subsequent address message
3281  */
3282 gint dissect_isup_subsequent_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3283 { proto_item* parameter_item;
3284   proto_tree* parameter_tree;
3285   tvbuff_t *parameter_tvb;
3286   gint offset = 0;
3287   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3288
3289   /* Do stuff for mandatory variable parameter Subsequent number */
3290   parameter_type = PARAM_TYPE_SUBSQT_NR;
3291
3292   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3293   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3294
3295   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3296                                        offset +  parameter_pointer,
3297                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3298                                        "Subsequent Number");
3299   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3300   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"));
3301   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);
3302   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);
3303   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3304   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3305   dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item);
3306   offset += PARAMETER_POINTER_LENGTH;
3307
3308   return offset;
3309 }
3310
3311 /* ------------------------------------------------------------------
3312   Dissector Message Type Information request message
3313  */
3314 gint
3315 dissect_isup_information_request_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3316 { proto_item* parameter_item;
3317   proto_tree* parameter_tree;
3318   tvbuff_t *parameter_tvb;
3319   gint offset = 0;
3320   gint parameter_type, actual_length;
3321
3322   /* Do stuff for first mandatory fixed parameter: Information request indicators*/
3323   parameter_type = PARAM_TYPE_INFO_REQ_IND;
3324   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3325                                        INFO_REQUEST_IND_LENGTH,
3326                                        "Information request indicators");
3327   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3328   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"));
3329   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3330   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(INFO_REQUEST_IND_LENGTH, actual_length), INFO_REQUEST_IND_LENGTH);
3331   dissect_isup_information_request_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3332   offset += INFO_REQUEST_IND_LENGTH;
3333   return offset;
3334 }
3335 /* ------------------------------------------------------------------
3336   Dissector Message Type Information
3337  */
3338 gint
3339 dissect_isup_information_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3340 { proto_item* parameter_item;
3341   proto_tree* parameter_tree;
3342   tvbuff_t *parameter_tvb;
3343   gint offset = 0;
3344   gint parameter_type, actual_length;
3345
3346   /* Do stuff for first mandatory fixed parameter: Information  indicators*/
3347   parameter_type = PARAM_TYPE_INFO_IND;
3348   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3349                                        INFO_IND_LENGTH,
3350                                        "Information indicators");
3351   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3352   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"));
3353   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3354   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(INFO_IND_LENGTH, actual_length), INFO_IND_LENGTH);
3355   dissect_isup_information_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3356   offset += INFO_IND_LENGTH;
3357   return offset;
3358 }
3359 /* ------------------------------------------------------------------
3360   Dissector Message Type Continuity
3361  */
3362 gint
3363 dissect_isup_continuity_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3364 { proto_item* parameter_item;
3365   proto_tree* parameter_tree;
3366   tvbuff_t *parameter_tvb;
3367   gint offset = 0;
3368   gint parameter_type, actual_length;
3369
3370   /* Do stuff for first mandatory fixed parameter: Continuity indicators*/
3371   parameter_type = PARAM_TYPE_CONTINUITY_IND;
3372   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3373                                        CONTINUITY_IND_LENGTH,
3374                                        "Continuity indicators");
3375   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3376   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"));
3377   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3378   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CONTINUITY_IND_LENGTH, actual_length), CONTINUITY_IND_LENGTH);
3379   dissect_isup_continuity_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3380   offset += CONTINUITY_IND_LENGTH;
3381   return offset;
3382 }
3383 /* ------------------------------------------------------------------
3384   Dissector Message Type Address complete
3385  */
3386 gint
3387 dissect_isup_address_complete_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3388 { proto_item* parameter_item;
3389   proto_tree* parameter_tree;
3390   tvbuff_t *parameter_tvb;
3391   gint offset = 0;
3392   gint parameter_type, actual_length;
3393
3394   /* Do stuff for first mandatory fixed parameter: backward call indicators*/
3395   parameter_type = PARAM_TYPE_BACKW_CALL_IND;
3396   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3397                                        BACKWARD_CALL_IND_LENGTH,
3398                                        "Backward Call Indicators");
3399   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3400   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"));
3401   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3402   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(BACKWARD_CALL_IND_LENGTH, actual_length), BACKWARD_CALL_IND_LENGTH);
3403   dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3404   offset += BACKWARD_CALL_IND_LENGTH;
3405   return offset;
3406 }
3407 /* ------------------------------------------------------------------
3408   Dissector Message Type Connect
3409  */
3410 gint
3411 dissect_isup_connect_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3412 { proto_item* parameter_item;
3413   proto_tree* parameter_tree;
3414   tvbuff_t *parameter_tvb;
3415   gint offset = 0;
3416   gint parameter_type, actual_length;
3417
3418   /* Do stuff for first mandatory fixed parameter: backward call indicators*/
3419   parameter_type = PARAM_TYPE_BACKW_CALL_IND;
3420   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3421                                        BACKWARD_CALL_IND_LENGTH,
3422                                        "Backward Call Indicators");
3423   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3424   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"));
3425   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3426   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(BACKWARD_CALL_IND_LENGTH, actual_length), BACKWARD_CALL_IND_LENGTH);
3427   dissect_isup_backward_call_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3428   offset += BACKWARD_CALL_IND_LENGTH;
3429   return offset;
3430 }
3431 /* ------------------------------------------------------------------
3432   Dissector Message Type release message
3433  */
3434 gint
3435 dissect_isup_release_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3436 { proto_item* parameter_item;
3437   proto_tree* parameter_tree;
3438   tvbuff_t *parameter_tvb;
3439   gint offset = 0;
3440   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3441
3442   /* Do stuff for mandatory variable parameter Cause indicators */
3443   parameter_type =  PARAM_TYPE_CAUSE_INDICATORS;
3444
3445   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3446   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3447
3448   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3449                                        offset +  parameter_pointer,
3450                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3451                                        "Cause indicators, see Q.850");
3452   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3453   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"));
3454   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);
3455   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);
3456   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3457   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3458   dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3459   offset += PARAMETER_POINTER_LENGTH;
3460
3461   return offset;
3462 }
3463 /* ------------------------------------------------------------------
3464   Dissector Message Type Resume/Suspend
3465  */
3466 gint
3467 dissect_isup_suspend_resume_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3468 { proto_item* parameter_item;
3469   proto_tree* parameter_tree;
3470   tvbuff_t *parameter_tvb;
3471   gint offset = 0;
3472   gint parameter_type, actual_length;
3473
3474   /* Do stuff for first mandatory fixed parameter: backward call indicators*/
3475   parameter_type = PARAM_TYPE_SUSP_RESUME_IND;
3476   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3477                                        SUSPEND_RESUME_IND_LENGTH,
3478                                        "Suspend/Resume indicator");
3479   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3480   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"));
3481   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3482   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(SUSPEND_RESUME_IND_LENGTH, actual_length), SUSPEND_RESUME_IND_LENGTH);
3483   dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3484   offset += SUSPEND_RESUME_IND_LENGTH;
3485   return offset;
3486 }
3487 /* ------------------------------------------------------------------
3488   Dissector Message Type Circuit group reset/query message
3489  */
3490 gint
3491 dissect_isup_circuit_group_reset_query_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3492 { proto_item* parameter_item;
3493   proto_tree* parameter_tree;
3494   tvbuff_t *parameter_tvb;
3495   gint offset = 0;
3496   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3497
3498   /* Do stuff for mandatory variable parameter range and status*/
3499   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3500
3501   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3502   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3503
3504   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3505                                        offset +  parameter_pointer,
3506                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3507                                        "Range and status");
3508   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3509   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"));
3510   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);
3511   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);
3512   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3513   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3514   dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3515   offset += PARAMETER_POINTER_LENGTH;
3516
3517   return offset;
3518 }
3519 /* ------------------------------------------------------------------
3520   Dissector Message Type Circuit group blocking/blocking ack/unblocking/unblocking ack messages
3521  */
3522 gint
3523 dissect_isup_circuit_group_blocking_messages(tvbuff_t *message_tvb, proto_tree *isup_tree)
3524 { proto_item* parameter_item;
3525   proto_tree* parameter_tree;
3526   tvbuff_t *parameter_tvb;
3527   gint offset = 0;
3528   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3529
3530    /* Do stuff for first mandatory fixed parameter: circuit group supervision message type*/
3531   parameter_type = PARAM_TYPE_CIRC_GRP_SV_MSG_TYPE;
3532   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3533                                        CIRC_GRP_SV_MSG_TYPE_LENGTH,
3534                                        "Circuit group supervision message type");
3535   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3536   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"));
3537   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3538   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(CIRC_GRP_SV_MSG_TYPE_LENGTH, actual_length), CIRC_GRP_SV_MSG_TYPE_LENGTH);
3539   dissect_isup_circuit_group_supervision_message_type_parameter(parameter_tvb, parameter_tree, parameter_item);
3540   offset += CIRC_GRP_SV_MSG_TYPE_LENGTH;
3541
3542   /* Do stuff for mandatory variable parameter range and status*/
3543   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3544
3545   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3546   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3547
3548   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3549                                        offset +  parameter_pointer,
3550                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3551                                        "Facility indicator");
3552   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3553   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"));
3554   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);
3555   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);
3556   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3557   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3558   dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
3559   offset += PARAMETER_POINTER_LENGTH;
3560
3561   return offset;
3562 }
3563
3564 /* ------------------------------------------------------------------
3565   Dissector Message Type Facility request/accepted
3566  */
3567 gint
3568 dissect_isup_facility_request_accepted_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3569 { proto_item* parameter_item;
3570   proto_tree* parameter_tree;
3571   tvbuff_t *parameter_tvb;
3572   gint offset = 0;
3573   gint parameter_type, actual_length;
3574
3575   /* Do stuff for first mandatory fixed parameter: facility indicators*/
3576   parameter_type = PARAM_TYPE_FACILITY_IND;
3577   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3578                                        FACILITY_IND_LENGTH,
3579                                        "Facility indicator");
3580   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3581   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"));
3582   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3583   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FACILITY_IND_LENGTH, actual_length), FACILITY_IND_LENGTH);
3584   dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
3585   offset += FACILITY_IND_LENGTH;
3586   return offset;
3587 }
3588 /* ------------------------------------------------------------------
3589   Dissector Message Type Facility reject
3590  */
3591 gint
3592 dissect_isup_facility_reject_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3593 { proto_item* parameter_item;
3594   proto_tree* parameter_tree;
3595   tvbuff_t *parameter_tvb;
3596   gint offset = 0;
3597   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3598
3599   /* Do stuff for first mandatory fixed parameter: facility indicators*/
3600   parameter_type = PARAM_TYPE_FACILITY_IND;
3601   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3602                                        FACILITY_IND_LENGTH,
3603                                        "Facility indicator");
3604   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3605   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"));
3606   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3607   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(FACILITY_IND_LENGTH, actual_length), FACILITY_IND_LENGTH);
3608   dissect_isup_facility_ind_parameter(parameter_tvb, parameter_item);
3609   offset += FACILITY_IND_LENGTH;
3610
3611   /* Do stuff for mandatory variable parameter Cause indicators */
3612   parameter_type =  PARAM_TYPE_CAUSE_INDICATORS;
3613
3614   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3615   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3616
3617   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3618                                        offset +  parameter_pointer,
3619                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3620                                        "Cause indicators, see Q.850");
3621   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3622   proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
3623   proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
3624   proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
3625   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3626   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3627   dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3628   offset += PARAMETER_POINTER_LENGTH;
3629
3630   return offset;
3631 }
3632 /* ------------------------------------------------------------------
3633   Dissector Message Type Circuit group reset acknowledgement message
3634  */
3635 gint
3636 dissect_isup_circuit_group_reset_acknowledgement_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3637 { proto_item* parameter_item;
3638   proto_tree* parameter_tree;
3639   tvbuff_t *parameter_tvb;
3640   gint offset = 0;
3641   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3642
3643   /* Do stuff for mandatory variable parameter range and status*/
3644   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3645
3646   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3647   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3648
3649   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3650                                        offset +  parameter_pointer,
3651                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3652                                        "Range and status");
3653   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3654   proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_type, message_tvb, 0, 0, parameter_type, "Mandatory Parameter: %u (%s)", parameter_type, val_to_str(parameter_type, isup_parameter_type_value,"unknown"));
3655   proto_tree_add_uint_format(parameter_tree, hf_isup_mandatory_variable_parameter_pointer, message_tvb, offset, PARAMETER_POINTER_LENGTH, parameter_pointer, "Pointer to Parameter: %u", parameter_pointer);
3656   proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
3657   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3658   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3659   dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3660   offset += PARAMETER_POINTER_LENGTH;
3661
3662   return offset;
3663 }
3664 /* ------------------------------------------------------------------
3665   Dissector Message Type Circuit group query response message
3666  */
3667 gint
3668 dissect_isup_circuit_group_query_response_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3669 { proto_item* parameter_item;
3670   proto_tree* parameter_tree;
3671   tvbuff_t *parameter_tvb;
3672   gint offset = 0;
3673   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3674
3675   /* Do stuff for 1. mandatory variable parameter range and status*/
3676   parameter_type =  PARAM_TYPE_RANGE_AND_STATUS;
3677
3678   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3679   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3680
3681   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3682                                        offset +  parameter_pointer,
3683                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3684                                        "Range and status");
3685   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3686   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"));
3687   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);
3688   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);
3689   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3690   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3691   dissect_isup_range_and_status_parameter(parameter_tvb, parameter_tree, parameter_item);
3692   offset += PARAMETER_POINTER_LENGTH;
3693
3694   /* Do stuff for 2. mandatory variable parameter Circuit state indicator*/
3695   parameter_type = PARAM_TYPE_CIRC_STATE_IND;
3696
3697   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3698   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3699
3700   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3701                                        offset +  parameter_pointer,
3702                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3703                                        "Circuit state indicator (national use)");
3704   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3705   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"));
3706   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);
3707   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);
3708   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3709   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3710   dissect_isup_circuit_state_ind_parameter(parameter_tvb, parameter_tree, parameter_item);
3711   offset += PARAMETER_POINTER_LENGTH;
3712
3713   return offset;
3714 }
3715 /* ------------------------------------------------------------------
3716   Dissector Message Type Call Progress
3717 */
3718 gint
3719 dissect_isup_call_progress_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3720 { proto_item* parameter_item;
3721   proto_tree* parameter_tree;
3722   tvbuff_t *parameter_tvb;
3723   gint offset = 0;
3724   gint parameter_type, actual_length;
3725
3726   /* Do stuff for first mandatory fixed parameter: Event information*/
3727   parameter_type = PARAM_TYPE_EVENT_INFO;
3728   parameter_item = proto_tree_add_text(isup_tree, message_tvb, offset,
3729                                        EVENT_INFO_LENGTH,
3730                                        "Event information");
3731   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3732   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"));
3733   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3734   parameter_tvb = tvb_new_subset(message_tvb, offset, MIN(EVENT_INFO_LENGTH, actual_length), EVENT_INFO_LENGTH);
3735   dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3736   offset += EVENT_INFO_LENGTH;
3737   return offset;
3738 }
3739 /* ------------------------------------------------------------------
3740   Dissector Message Type User-to-User information
3741  */
3742 gint
3743 dissect_isup_user_to_user_information_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3744 { proto_item* parameter_item;
3745   proto_tree* parameter_tree;
3746   tvbuff_t *parameter_tvb;
3747   gint offset = 0;
3748   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3749
3750   /* Do stuff for mandatory variable parameter User-to-user information*/
3751   parameter_type =  PARAM_TYPE_USER_TO_USER_INFO;
3752
3753   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3754   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3755
3756   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3757                                        offset +  parameter_pointer,
3758                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3759                                        "User-to-user information, see Q.931");
3760   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3761   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"));
3762   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);
3763   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);
3764   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3765   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3766   dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
3767   offset += PARAMETER_POINTER_LENGTH;
3768
3769   return offset;
3770 }
3771 /* ------------------------------------------------------------------
3772   Dissector Message Type Confusion
3773  */
3774 gint
3775 dissect_isup_confusion_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
3776 { proto_item* parameter_item;
3777   proto_tree* parameter_tree;
3778   tvbuff_t *parameter_tvb;
3779   gint offset = 0;
3780   gint parameter_type, parameter_pointer, parameter_length, actual_length;
3781
3782   /* Do stuff for mandatory variable parameter Cause indicators */
3783   parameter_type =  PARAM_TYPE_CAUSE_INDICATORS;
3784
3785   parameter_pointer = tvb_get_guint8(message_tvb, offset);
3786   parameter_length = tvb_get_guint8(message_tvb, offset + parameter_pointer);
3787
3788   parameter_item = proto_tree_add_text(isup_tree, message_tvb,
3789                                        offset +  parameter_pointer,
3790                                        parameter_length + PARAMETER_LENGTH_IND_LENGTH,
3791                                        "Cause indicators, see Q.850");
3792   parameter_tree = proto_item_add_subtree(parameter_item, ett_isup_parameter);
3793   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"));
3794   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);
3795   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);
3796   actual_length = tvb_ensure_length_remaining(message_tvb, offset);
3797   parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
3798   dissect_isup_cause_indicators_parameter(parameter_tvb, parameter_tree, parameter_item);
3799   offset += PARAMETER_POINTER_LENGTH;
3800
3801   return offset;
3802 }
3803 /* ------------------------------------------------------------------ */
3804 static void
3805 dissect_isup_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup_tree)
3806 {
3807   tvbuff_t *parameter_tvb;
3808   tvbuff_t *optional_parameter_tvb;
3809   proto_item* pass_along_item;
3810   proto_tree* pass_along_tree;
3811   gint offset, bufferlength;
3812   guint8 message_type, opt_parameter_pointer;
3813   gint opt_part_possible = FALSE; /* default setting - for message types allowing optional
3814                                      params explicitely set to TRUE in case statement */
3815   offset = 0;
3816
3817   /* Extract message type field */
3818   message_type = tvb_get_guint8(message_tvb,0);
3819
3820    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);
3821    offset +=  MESSAGE_TYPE_LENGTH;
3822
3823    bufferlength = tvb_ensure_length_remaining(message_tvb, offset);
3824    parameter_tvb = tvb_new_subset(message_tvb, offset, bufferlength, bufferlength);
3825
3826    /* distinguish between message types:*/
3827    switch (message_type) {
3828      case MESSAGE_TYPE_INITIAL_ADDR:
3829        offset += dissect_isup_initial_address_message(parameter_tvb, isup_tree);
3830        opt_part_possible = TRUE;
3831       break;
3832     case MESSAGE_TYPE_SUBSEQ_ADDR:
3833        offset += dissect_isup_subsequent_address_message(parameter_tvb, isup_tree);
3834        opt_part_possible = TRUE;
3835       break;
3836     case MESSAGE_TYPE_INFO_REQ:
3837        offset += dissect_isup_information_request_message(parameter_tvb, isup_tree);
3838        opt_part_possible = TRUE;
3839       break;
3840     case MESSAGE_TYPE_INFO:
3841        offset += dissect_isup_information_message(parameter_tvb, isup_tree);
3842        opt_part_possible = TRUE;
3843       break;
3844     case MESSAGE_TYPE_CONTINUITY:
3845        offset += dissect_isup_continuity_message(parameter_tvb, isup_tree);
3846       break;
3847     case MESSAGE_TYPE_ADDR_CMPL:
3848        offset += dissect_isup_address_complete_message(parameter_tvb, isup_tree);
3849        opt_part_possible = TRUE;
3850       break;
3851     case MESSAGE_TYPE_CONNECT:
3852        offset += dissect_isup_connect_message(parameter_tvb, isup_tree);
3853        opt_part_possible = TRUE;
3854       break;
3855     case MESSAGE_TYPE_FORW_TRANS:
3856       /* no dissector necessary since no mandatory parameters included */
3857        opt_part_possible = TRUE;
3858       break;
3859     case MESSAGE_TYPE_ANSWER:
3860       /* no dissector necessary since no mandatory parameters included */
3861        opt_part_possible = TRUE;
3862       break;
3863     case MESSAGE_TYPE_RELEASE:
3864        offset += dissect_isup_release_message(parameter_tvb, isup_tree);
3865        opt_part_possible = TRUE;
3866       break;
3867     case MESSAGE_TYPE_SUSPEND:
3868        offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
3869        opt_part_possible = TRUE;
3870       break;
3871     case MESSAGE_TYPE_RESUME:
3872        offset += dissect_isup_suspend_resume_message(parameter_tvb, isup_tree);
3873        opt_part_possible = TRUE;
3874       break;
3875     case MESSAGE_TYPE_REL_CMPL:
3876       /* no dissector necessary since no mandatory parameters included */
3877        opt_part_possible = TRUE;
3878       break;
3879     case MESSAGE_TYPE_CONT_CHECK_REQ:
3880       /* no dissector necessary since no mandatory parameters included */
3881       break;
3882     case MESSAGE_TYPE_RESET_CIRCUIT:
3883       /* no dissector necessary since no mandatory parameters included */
3884       break;
3885     case MESSAGE_TYPE_BLOCKING:
3886       /* no dissector necessary since no mandatory parameters included */
3887       break;
3888     case MESSAGE_TYPE_UNBLOCKING:
3889       /* no dissector necessary since no mandatory parameters included */
3890       break;
3891     case MESSAGE_TYPE_BLOCK_ACK:
3892       /* no dissector necessary since no mandatory parameters included */
3893       break;
3894     case MESSAGE_TYPE_UNBLOCK_ACK:
3895       /* no dissector necessary since no mandatory parameters included */
3896       break;
3897     case MESSAGE_TYPE_CIRC_GRP_RST:
3898        offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
3899       break;
3900     case MESSAGE_TYPE_CIRC_GRP_BLCK:
3901        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3902       break;
3903     case MESSAGE_TYPE_CIRC_GRP_UNBL:
3904        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3905       break;
3906     case MESSAGE_TYPE_CIRC_GRP_BL_ACK:
3907        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3908       break;
3909     case MESSAGE_TYPE_CIRC_GRP_UNBL_ACK:
3910        offset += dissect_isup_circuit_group_blocking_messages(parameter_tvb, isup_tree);
3911       break;
3912     case MESSAGE_TYPE_FACILITY_REQ:
3913        offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
3914        opt_part_possible = TRUE;
3915       break;
3916     case MESSAGE_TYPE_FACILITY_ACC:
3917        offset += dissect_isup_facility_request_accepted_message(parameter_tvb, isup_tree);
3918        opt_part_possible = TRUE;
3919       break;
3920     case MESSAGE_TYPE_FACILITY_REJ:
3921        offset += dissect_isup_facility_reject_message(parameter_tvb, isup_tree);
3922        opt_part_possible = TRUE;
3923       break;
3924     case MESSAGE_TYPE_LOOP_BACK_ACK:
3925       /* no dissector necessary since no mandatory parameters included */
3926       break;
3927     case MESSAGE_TYPE_PASS_ALONG:
3928       /* call dissect_isup_message recursively */
3929       { guint8 pa_message_type;
3930         pa_message_type = tvb_get_guint8(parameter_tvb, 0);
3931         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);
3932         pass_along_tree = proto_item_add_subtree(pass_along_item, ett_isup_pass_along_message);
3933         dissect_isup_message(parameter_tvb, pinfo, pass_along_tree);
3934         break;
3935       }
3936     case MESSAGE_TYPE_CIRC_GRP_RST_ACK:
3937        offset += dissect_isup_circuit_group_reset_acknowledgement_message(parameter_tvb, isup_tree);
3938       break;
3939     case MESSAGE_TYPE_CIRC_GRP_QRY:
3940        offset += dissect_isup_circuit_group_reset_query_message(parameter_tvb, isup_tree);
3941       break;
3942     case MESSAGE_TYPE_CIRC_GRP_QRY_RSP:
3943        offset += dissect_isup_circuit_group_query_response_message(parameter_tvb, isup_tree);
3944       break;
3945     case MESSAGE_TYPE_CALL_PROGRSS:
3946        offset += dissect_isup_call_progress_message(parameter_tvb, isup_tree);
3947        opt_part_possible = TRUE;
3948       break;
3949     case MESSAGE_TYPE_USER2USER_INFO:
3950       offset += dissect_isup_user_to_user_information_message(parameter_tvb, isup_tree);
3951       opt_part_possible = TRUE;
3952       break;
3953     case MESSAGE_TYPE_UNEQUIPPED_CIC:
3954       /* no dissector necessary since no mandatory parameters included */
3955       break;
3956     case MESSAGE_TYPE_CONFUSION:
3957       offset += dissect_isup_confusion_message(parameter_tvb, isup_tree);
3958        opt_part_possible = TRUE;
3959       break;
3960     case MESSAGE_TYPE_OVERLOAD:
3961       /* no dissector necessary since no mandatory parameters included */
3962       break;
3963     case MESSAGE_TYPE_CHARGE_INFO:
3964       /* do nothing since format is a national matter */
3965       proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Format is a national matter");
3966       break;
3967     case MESSAGE_TYPE_NETW_RESRC_MGMT:
3968       /* no dissector necessary since no mandatory parameters included */
3969        opt_part_possible = TRUE;
3970       break;
3971     case MESSAGE_TYPE_FACILITY:
3972       /* no dissector necessary since no mandatory parameters included */
3973        opt_part_possible = TRUE;
3974       break;
3975     case MESSAGE_TYPE_USER_PART_TEST:
3976       /* no dissector necessary since no mandatory parameters included */
3977        opt_part_possible = TRUE;
3978       break;
3979     case MESSAGE_TYPE_USER_PART_AVAIL:
3980       /* no dissector necessary since no mandatory parameters included */
3981        opt_part_possible = TRUE;
3982       break;
3983     case MESSAGE_TYPE_IDENT_REQ:
3984       /* no dissector necessary since no mandatory parameters included */
3985        opt_part_possible = TRUE;
3986       break;
3987     case MESSAGE_TYPE_IDENT_RSP:
3988       /* no dissector necessary since no mandatory parameters included */
3989        opt_part_possible = TRUE;
3990       break;
3991     case MESSAGE_TYPE_SEGMENTATION:
3992       /* no dissector necessary since no mandatory parameters included */
3993        opt_part_possible = TRUE;
3994       break;
3995     case MESSAGE_TYPE_LOOP_PREVENTION:
3996       /* no dissector necessary since no mandatory parameters included */
3997        opt_part_possible = TRUE;
3998       break;
3999     default:
4000       proto_tree_add_text(isup_tree, parameter_tvb, 0, bufferlength, "Unknown Message type (possibly reserved/used in former ISUP version)");
4001       break;
4002   }
4003
4004    /* extract pointer to start of optional part (if any) */
4005    if (opt_part_possible == TRUE){
4006      opt_parameter_pointer = tvb_get_guint8(message_tvb, offset);
4007      if (opt_parameter_pointer > 0){
4008        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);
4009        offset += opt_parameter_pointer;
4010        optional_parameter_tvb = tvb_new_subset(message_tvb, offset, -1, -1 );
4011        dissect_isup_optional_parameter(optional_parameter_tvb, isup_tree);
4012      }
4013      else
4014        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);
4015    }
4016    else if (message_type !=MESSAGE_TYPE_CHARGE_INFO)
4017      proto_tree_add_text(isup_tree, message_tvb, 0, 0, "No optional parameters are possible with this message type");
4018
4019 }
4020
4021 /* ------------------------------------------------------------------ */
4022 static void
4023 dissect_isup(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4024 {
4025
4026 /* Set up structures needed to add the protocol subtree and manage it */
4027         proto_item *ti;
4028         proto_tree *isup_tree;
4029         tvbuff_t *message_tvb;
4030         guint16 cic;
4031         guint8 message_type;
4032
4033 /* Make entries in Protocol column and Info column on summary display */
4034         if (check_col(pinfo->cinfo, COL_PROTOCOL))
4035                 col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISUP");
4036
4037 /* Extract message type field */
4038         message_type = tvb_get_guint8(tvb, CIC_OFFSET + CIC_LENGTH);
4039
4040         if (check_col(pinfo->cinfo, COL_INFO)){
4041                 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str(message_type, isup_message_type_value_acro, "reserved"));
4042                 col_set_fence(pinfo->cinfo, COL_INFO);
4043         }
4044
4045 /* In the interest of speed, if "tree" is NULL, don't do any work not
4046    necessary to generate protocol tree items. */
4047         if (tree) {
4048                 ti = proto_tree_add_item(tree, proto_isup, tvb, 0, -1, FALSE);
4049                 isup_tree = proto_item_add_subtree(ti, ett_isup);
4050
4051                 /* dissect CIC in main dissector since pass-along message type carrying complete IUSP message w/o CIC needs
4052                    recursive message dissector call */
4053                 cic =          tvb_get_letohs(tvb, CIC_OFFSET) & 0x0FFF; /*since upper 4 bits spare */
4054
4055                 proto_tree_add_uint_format(isup_tree, hf_isup_cic, tvb, CIC_OFFSET, CIC_LENGTH, cic, "CIC: %u", cic);
4056
4057                 message_tvb = tvb_new_subset(tvb, CIC_LENGTH, -1, -1);
4058                 dissect_isup_message(message_tvb, pinfo, isup_tree);
4059         }
4060 }
4061
4062
4063 /*---------------------------------------------------------------------*/
4064 /* Register the protocol with Ethereal */
4065 void
4066 proto_register_isup(void)
4067 {
4068 /* Setup list of header fields  See Section 1.6.1 for details*/
4069         static hf_register_info hf[] = {
4070                 { &hf_isup_cic,
4071                         { "CIC",           "isup.cic",
4072                         FT_UINT16, BASE_HEX, NULL, 0xFF0F,
4073                           "", HFILL }},
4074
4075                 { &hf_isup_message_type,
4076                         { "Message Type",  "isup.message_type",
4077                         FT_UINT8, BASE_DEC, NULL, 0x0,
4078                         "", HFILL }},
4079
4080                 { &hf_isup_parameter_type,
4081                         { "Parameter Type",  "isup.parameter_type",
4082                         FT_UINT8, BASE_DEC, NULL, 0x0,
4083                         "", HFILL }},
4084
4085                 { &hf_isup_parameter_length,
4086                         { "Parameter Length",  "isup.parameter_length",
4087                         FT_UINT8, BASE_DEC, NULL, 0x0,
4088                         "", HFILL }},
4089
4090                 { &hf_isup_mandatory_variable_parameter_pointer,
4091                         { "Pointer to Parameter",  "isup.mandatory_variable_parameter_pointer",
4092                         FT_UINT8, BASE_DEC, NULL, 0x0,
4093                         "", HFILL }},
4094
4095                 { &hf_isup_pointer_to_start_of_optional_part,
4096                         { "Pointer to optional parameter part",  "isup.optional_parameter_part_pointer",
4097                         FT_UINT8, BASE_DEC, NULL, 0x0,
4098                         "", HFILL }},
4099
4100                 { &hf_isup_satellite_indicator,
4101                         { "Satellite Indicator",  "isup.satellite_indicator",
4102                         FT_UINT8, BASE_HEX, VALS(isup_satellite_ind_value), BA_8BIT_MASK,
4103                         "", HFILL }},
4104
4105                 { &hf_isup_continuity_check_indicator,
4106                         { "Continuity Check Indicator",  "isup.continuity_check_indicator",
4107                         FT_UINT8, BASE_HEX, VALS(isup_continuity_check_ind_value), DC_8BIT_MASK,
4108                         "", HFILL }},
4109
4110                 { &hf_isup_echo_control_device_indicator,
4111                         { "Echo Control Device Indicator",  "isup.echo_control_device_indicator",
4112                         FT_BOOLEAN, 8, TFS(&isup_echo_control_device_ind_value),E_8BIT_MASK,
4113                         "", HFILL }},
4114
4115                 { &hf_isup_forw_call_natnl_inatnl_call_indicator,
4116                         { "National/international call indicator",  "isup.forw_call_natnl_inatnl_call_indicator",
4117                         FT_BOOLEAN, 16, TFS(&isup_natnl_inatnl_call_ind_value),A_16BIT_MASK,
4118                         "", HFILL }},
4119
4120                 { &hf_isup_forw_call_end_to_end_method_indicator,
4121                         { "End-to-end method indicator",  "isup.forw_call_end_to_end_method_indicator",
4122                         FT_UINT16, BASE_HEX, VALS(isup_end_to_end_method_ind_value), CB_16BIT_MASK,
4123                         "", HFILL }},
4124
4125                 { &hf_isup_forw_call_interworking_indicator,
4126                         { "Interworking indicator",  "isup.forw_call_interworking_indicator",
4127                         FT_BOOLEAN, 16, TFS(&isup_interworking_ind_value), D_16BIT_MASK,
4128                         "", HFILL }},
4129
4130                 { &hf_isup_forw_call_end_to_end_info_indicator,
4131                         { "End-to-end information indicator",  "isup.forw_call_end_to_end_information_indicator",
4132                         FT_BOOLEAN, 16, TFS(&isup_end_to_end_info_ind_value), E_16BIT_MASK,
4133                         "", HFILL }},
4134
4135                 { &hf_isup_forw_call_isdn_user_part_indicator,
4136                         { "ISDN user part indicator",  "isup.forw_call_isdn_user_part_indicator",
4137                         FT_BOOLEAN, 16, TFS(&isup_ISDN_user_part_ind_value), F_16BIT_MASK,
4138                         "", HFILL }},
4139
4140                 { &hf_isup_forw_call_preferences_indicator,
4141                         { "ISDN user part preference indicator",  "isup.forw_call_preferences_indicator",
4142                         FT_UINT16, BASE_HEX, VALS(isup_preferences_ind_value), HG_16BIT_MASK,
4143                         "", HFILL }},
4144
4145                 { &hf_isup_forw_call_isdn_access_indicator,
4146                         { "ISDN access indicator",  "isup.forw_call_isdn_access_indicator",
4147                         FT_BOOLEAN, 16, TFS(&isup_ISDN_originating_access_ind_value), I_16BIT_MASK,
4148                         "", HFILL }},
4149
4150                 { &hf_isup_forw_call_sccp_method_indicator,
4151                         { "SCCP method indicator",  "isup.forw_call_sccp_method_indicator",
4152                         FT_UINT16, BASE_HEX, VALS(isup_SCCP_method_ind_value), KJ_16BIT_MASK,
4153                         "", HFILL }},
4154
4155                 { &hf_isup_calling_partys_category,
4156                         { "Calling Party's category",  "isup.calling_partys_category",
4157                         FT_UINT8, BASE_HEX, VALS(isup_calling_partys_category_value), 0x0,
4158                         "", HFILL }},
4159
4160                 { &hf_isup_transmission_medium_requirement,
4161                         { "Transmission medium requirement",  "isup.transmission_medium_requirement",
4162                         FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_value), 0x0,
4163                         "", HFILL }},
4164
4165                 { &hf_isup_odd_even_indicator,
4166                         { "Odd/even indicator",  "isup.isdn_odd_even_indicator",
4167                         FT_BOOLEAN, 8, TFS(&isup_odd_even_ind_value), ISUP_ODD_EVEN_MASK,
4168                         "", HFILL }},
4169
4170                 { &hf_isup_called_party_nature_of_address_indicator,
4171                         { "Nature of address indicator",  "isup.called_party_nature_of_address_indicator",
4172                         FT_UINT8, BASE_DEC, VALS(isup_called_party_nature_of_address_ind_value), ISUP_NATURE_OF_ADDRESS_IND_MASK,
4173                         "", HFILL }},
4174
4175                 { &hf_isup_calling_party_nature_of_address_indicator,
4176                         { "Nature of address indicator",  "isup.calling_party_nature_of_address_indicator",
4177                         FT_UINT8, BASE_DEC, VALS(isup_calling_party_nature_of_address_ind_value), ISUP_NATURE_OF_ADDRESS_IND_MASK,
4178                         "", HFILL }},
4179
4180                 { &hf_isup_inn_indicator,
4181                         { "INN indicator",  "isup.inn_indicator",
4182                         FT_BOOLEAN, 8, TFS(&isup_INN_ind_value), ISUP_INN_MASK,
4183                         "", HFILL }},
4184
4185                 { &hf_isup_ni_indicator,
4186                         { "NI indicator",  "isup.ni_indicator",
4187                         FT_BOOLEAN, 8, TFS(&isup_NI_ind_value), ISUP_NI_MASK,
4188                         "", HFILL }},
4189
4190                 { &hf_isup_numbering_plan_indicator,
4191                         { "Numbering plan indicator",  "isup.numbering_plan_indicator",
4192                         FT_UINT8, BASE_DEC, VALS(isup_numbering_plan_ind_value), ISUP_NUMBERING_PLAN_IND_MASK,
4193                         "", HFILL }},
4194
4195                 { &hf_isup_address_presentation_restricted_indicator,
4196                         { "Address presentation restricted indicator",  "isup.address_presentation_restricted_indicator",
4197                         FT_UINT8, BASE_DEC, VALS(isup_address_presentation_restricted_ind_value), ISUP_ADDRESS_PRESENTATION_RESTR_IND_MASK,
4198                         "", HFILL }},
4199
4200                 { &hf_isup_screening_indicator,
4201                         { "Screening indicator",  "isup.screening_indicator",
4202                         FT_UINT8, BASE_DEC, VALS(isup_screening_ind_value), ISUP_SCREENING_IND_MASK,
4203                         "", HFILL }},
4204
4205                 { &hf_isup_screening_indicator_enhanced,
4206                         { "Screening indicator",  "isup.screening_indicator_enhanced",
4207                         FT_UINT8, BASE_DEC, VALS(isup_screening_ind_enhanced_value), ISUP_SCREENING_IND_MASK,
4208                         "", HFILL }},
4209
4210                 { &hf_isup_called_party_odd_address_signal_digit,
4211                         { "Address signal digit",  "isup.called_party_odd_address_signal_digit",
4212                         FT_UINT8, BASE_DEC, VALS(isup_called_party_address_digit_value), ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK,
4213                         "", HFILL }},
4214
4215                 { &hf_isup_calling_party_odd_address_signal_digit,
4216                         { "Address signal digit",  "isup.calling_party_odd_address_signal_digit",
4217                         FT_UINT8, BASE_DEC, VALS(isup_calling_party_address_digit_value), ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK,
4218                         "", HFILL }},
4219
4220                 { &hf_isup_called_party_even_address_signal_digit,
4221                         { "Address signal digit",  "isup.called_party_even_address_signal_digit",
4222                         FT_UINT8, BASE_DEC, VALS(isup_called_party_address_digit_value), ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK,
4223                         "", HFILL }},
4224
4225                 { &hf_isup_calling_party_even_address_signal_digit,
4226                         { "Address signal digit",  "isup.calling_party_even_address_signal_digit",
4227                         FT_UINT8, BASE_DEC, VALS(isup_calling_party_address_digit_value), ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK,
4228                         "", HFILL }},
4229
4230                 { &hf_isup_calling_party_address_request_indicator,
4231                         { "Calling party address request indicator",  "isup.calling_party_address_request_indicator",
4232                         FT_BOOLEAN, 16, TFS(&isup_calling_party_address_request_ind_value), A_16BIT_MASK,
4233                         "", HFILL }},
4234
4235                 { &hf_isup_info_req_holding_indicator,
4236                         { "Holding indicator",  "isup.info_req_holding_indicator",
4237                         FT_BOOLEAN, 16, TFS(&isup_holding_ind_value), B_16BIT_MASK,
4238                         "", HFILL }},
4239
4240                 { &hf_isup_calling_partys_category_request_indicator,
4241                         { "Calling party's category request indicator",  "isup.calling_partys_category_request_indicator",
4242                         FT_BOOLEAN, 16, TFS(&isup_calling_partys_category_request_ind_value), D_16BIT_MASK,
4243                         "", HFILL }},
4244
4245                 { &hf_isup_charge_information_request_indicator,
4246                         { "Charge information request indicator",  "isup.charge_information_request_indicator",
4247                         FT_BOOLEAN, 16, TFS(&isup_charge_information_request_ind_value), E_16BIT_MASK,
4248                         "", HFILL }},
4249
4250                 { &hf_isup_malicious_call_identification_request_indicator,
4251                         { "Malicious call identification request indicator (ISUP'88)",  "isup.malicious_call_ident_request_indicator",
4252                         FT_BOOLEAN, 16, TFS(&isup_malicious_call_identification_request_ind_value), H_16BIT_MASK,
4253                         "", HFILL }},
4254
4255                 { &hf_isup_calling_party_address_response_indicator,
4256                         { "Calling party address response indicator",  "isup.calling_party_address_response_indicator",
4257                         FT_UINT16, BASE_HEX, VALS(isup_calling_party_address_response_ind_value), BA_16BIT_MASK,
4258                         "", HFILL }},
4259
4260                 { &hf_isup_hold_provided_indicator,
4261                         { "Hold provided indicator",  "isup.hold_provided_indicator",
4262                         FT_BOOLEAN, 16, TFS(&isup_hold_provided_ind_value), C_16BIT_MASK,
4263                         "", HFILL }},
4264
4265                 { &hf_isup_calling_partys_category_response_indicator,
4266                         { "Calling party's category response indicator",  "isup.calling_partys_category_response_indicator",
4267                         FT_BOOLEAN, 16, TFS(&isup_calling_partys_category_response_ind_value), F_16BIT_MASK,
4268                         "", HFILL }},
4269
4270                 { &hf_isup_charge_information_response_indicator,
4271                         { "Charge information response indicator",  "isup.charge_information_response_indicator",
4272                         FT_BOOLEAN, 16, TFS(&isup_charge_information_response_ind_value), G_16BIT_MASK,
4273                         "", HFILL }},
4274
4275                 { &hf_isup_solicited_indicator,
4276                         { "Solicited indicator",  "isup.solicided_indicator",
4277                         FT_BOOLEAN, 16, TFS(&isup_solicited_information_ind_value), H_16BIT_MASK,
4278                         "", HFILL }},
4279
4280                 { &hf_isup_continuity_indicator,
4281                         { "Continuity indicator",  "isup.continuity_indicator",
4282                         FT_BOOLEAN, 8, TFS(&isup_continuity_ind_value), A_8BIT_MASK,
4283                         "", HFILL }},
4284
4285                 { &hf_isup_backw_call_charge_ind,
4286                         { "Charge indicator",  "isup.charge_indicator",
4287                         FT_UINT16, BASE_HEX, VALS(isup_charge_ind_value), BA_16BIT_MASK,
4288                         "", HFILL }},
4289
4290                 { &hf_isup_backw_call_called_partys_status_ind,
4291                         { "Called party's status indicator",  "isup.called_partys_status_indicator",
4292                         FT_UINT16, BASE_HEX, VALS(isup_called_partys_status_ind_value), DC_16BIT_MASK,
4293                         "", HFILL }},
4294
4295                 { &hf_isup_backw_call_called_partys_category_ind,
4296                         { "Called party's category indicator",  "isup.called_partys_category_indicator",
4297                         FT_UINT16, BASE_HEX, VALS(isup_called_partys_category_ind_value), FE_16BIT_MASK,
4298                         "", HFILL }},
4299
4300                 { &hf_isup_backw_call_end_to_end_method_ind,
4301                         { "End-to-end method indicator",  "isup.backw_call_end_to_end_method_indicator",
4302                         FT_UINT16, BASE_HEX, VALS(isup_end_to_end_method_ind_value), HG_16BIT_MASK,
4303                         "", HFILL }},
4304
4305                 { &hf_isup_backw_call_interworking_ind,
4306                         { "Interworking indicator",  "isup.backw_call_interworking_indicator",
4307                         FT_BOOLEAN, 16, TFS(&isup_interworking_ind_value), I_16BIT_MASK,
4308                         "", HFILL }},
4309
4310                 { &hf_isup_backw_call_end_to_end_info_ind,
4311                         { "End-to-end information indicator",  "isup.backw_call_end_to_end_information_indicator",
4312                         FT_BOOLEAN, 16, TFS(&isup_end_to_end_info_ind_value), J_16BIT_MASK,
4313                         "", HFILL }},
4314
4315                 { &hf_isup_backw_call_isdn_user_part_ind,
4316                         { "ISDN user part indicator",  "isup.backw_call_isdn_user_part_indicator",
4317                         FT_BOOLEAN, 16, TFS(&isup_ISDN_user_part_ind_value), K_16BIT_MASK,
4318                         "", HFILL }},
4319
4320                 { &hf_isup_backw_call_holding_ind,
4321                         { "Holding indicator",  "isup.backw_call_holding_indicator",
4322                         FT_BOOLEAN, 16, TFS(&isup_holding_ind_value), L_16BIT_MASK,
4323                         "", HFILL }},
4324
4325                 { &hf_isup_backw_call_isdn_access_ind,
4326                         { "ISDN access indicator",  "isup.backw_call_isdn_access_indicator",
4327                         FT_BOOLEAN, 16, TFS(&isup_ISDN_terminating_access_ind_value), M_16BIT_MASK,
4328                         "", HFILL }},
4329
4330                 { &hf_isup_backw_call_echo_control_device_ind,
4331                         { "Echo Control Device Indicator",  "isup.backw_call_echo_control_device_indicator",
4332                         FT_BOOLEAN, 16, TFS(&isup_echo_control_device_ind_value), N_16BIT_MASK,
4333                         "", HFILL }},
4334
4335                 { &hf_isup_backw_call_sccp_method_ind,
4336                         { "SCCP method indicator",  "isup.backw_call_sccp_method_indicator",
4337                         FT_UINT16, BASE_HEX, VALS(isup_SCCP_method_ind_value), PO_16BIT_MASK,
4338                         "", HFILL }},
4339
4340                 { &hf_isup_cause_indicator,
4341                         { "Cause indicator",  "isup.cause_indicator",
4342                         FT_UINT8, BASE_DEC, VALS(q850_cause_code_vals), 0x0,
4343                         "", HFILL }},
4344
4345                 { &hf_isup_suspend_resume_indicator,
4346                         { "Suspend/Resume indicator",  "isup.suspend_resume_indicator",
4347                         FT_BOOLEAN, 8, TFS(&isup_suspend_resume_ind_value), A_8BIT_MASK,
4348                         "", HFILL }},
4349
4350                 { &hf_isup_transmission_medium_requirement,
4351                         { "Transmission medium requirement",  "isup.transmission_medium_requirement",
4352                         FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_value), 0x0,
4353                         "", HFILL }},
4354
4355                 { &hf_isup_range_indicator,
4356                         { "Range indicator",  "isup.range_indicator",
4357                           FT_UINT8, BASE_DEC, NULL , 0x0,
4358                           "", HFILL }},
4359
4360                 { &hf_isup_cgs_message_type,
4361                         { "Circuit group supervision message type",  "isup.cgs_message_type",
4362                         FT_UINT8, BASE_DEC, VALS(isup_cgs_message_type_value), BA_8BIT_MASK,
4363                         "", HFILL }},
4364
4365                 { &hf_isup_mtc_blocking_state1,
4366                         { "Maintenance blocking state",  "isup.mtc_blocking_state",
4367                         FT_UINT8, BASE_DEC, VALS(isup_mtc_blocking_state_DC00_value), BA_8BIT_MASK,
4368                         "", HFILL }},
4369
4370                 { &hf_isup_mtc_blocking_state2,
4371                         { "Maintenance blocking state",  "isup.mtc_blocking_state",
4372                         FT_UINT8, BASE_DEC, VALS(isup_mtc_blocking_state_DCnot00_value), BA_8BIT_MASK,
4373                         "", HFILL }},
4374
4375                 { &hf_isup_call_proc_state,
4376                         { "Call processing state",  "isup.call_processing_state",
4377                         FT_UINT8, BASE_DEC, VALS(isup_call_processing_state_value), DC_8BIT_MASK,
4378                         "", HFILL }},
4379
4380                 { &hf_isup_hw_blocking_state,
4381                         { "HW blocking state",  "isup.hw_blocking_state",
4382                         FT_UINT8, BASE_DEC, VALS(isup_HW_blocking_state_value), FE_8BIT_MASK,
4383                         "", HFILL }},
4384
4385                 { &hf_isup_event_ind,
4386                         { "Event indicator",  "isup.event_ind",
4387                           FT_UINT8, 8, NULL, 0x0,
4388                         "", HFILL }},
4389
4390                 { &hf_isup_event_presentation_restricted_ind,
4391                         { "Event presentation restricted indicator",  "isup.event_presentatiation_restr_ind",
4392                         FT_BOOLEAN, 8, TFS(&isup_event_presentation_restricted_ind_value), H_8BIT_MASK,
4393                         "", HFILL }},
4394
4395                 { &hf_isup_cug_call_ind,
4396                         { "Closed user group call indicator",  "isup.clg_call_ind",
4397                         FT_UINT8, BASE_DEC, VALS(isup_CUG_call_ind_value), BA_8BIT_MASK,
4398                         "", HFILL }},
4399
4400                 { &hf_isup_simple_segmentation_ind,
4401                         { "Simple segmentation indicator",  "isup.simple_segmentation_ind",
4402                         FT_BOOLEAN, 8, TFS(&isup_simple_segmentation_ind_value), C_8BIT_MASK,
4403                         "", HFILL }},
4404
4405                 { &hf_isup_connected_line_identity_request_ind,
4406                         { "Connected line identity request indicator",  "isup.connected_line_identity_request_ind",
4407                         FT_BOOLEAN, 8, TFS(&isup_connected_line_identity_request_ind_value), H_8BIT_MASK,
4408                         "", HFILL }},
4409
4410                 { &hf_isup_redirecting_ind,
4411                         { "Redirection indicator",  "isup.redirecting_ind",
4412                         FT_UINT16, BASE_DEC, VALS(isup_redirecting_ind_value), CBA_16BIT_MASK,
4413                         "", HFILL }},
4414
4415                 { &hf_isup_original_redirection_reason,
4416                         { "Original redirection reason",  "isup.original_redirection_reason",
4417                         FT_UINT16, BASE_DEC, VALS(isup_original_redirection_reason_value), HGFE_16BIT_MASK,
4418                         "", HFILL }},
4419
4420                 { &hf_isup_redirection_counter,
4421                         { "Redirection counter",  "isup.redirection_counter",
4422                         FT_UINT16, BASE_DEC, NULL, KJI_16BIT_MASK,
4423                         "", HFILL }},
4424
4425                 { &hf_isup_redirection_reason,
4426                         { "Redirection reason",  "isup.redirection_reason",
4427                         FT_UINT16, BASE_DEC, VALS(isup_redirection_reason_value), PONM_16BIT_MASK,
4428                         "", HFILL }},
4429
4430                 { &hf_isup_type_of_network_identification,
4431                         { "Type of network identification",  "isup.type_of_network_identification",
4432                         FT_UINT8, BASE_DEC, VALS(isup_type_of_network_identification_value), GFE_8BIT_MASK,
4433                         "", HFILL }},
4434
4435                 { &hf_isup_network_identification_plan,
4436                         { "Network identification plan",  "isup.network_identification_plan",
4437                         FT_UINT8, BASE_DEC, VALS(isup_network_identification_plan_value), DCBA_8BIT_MASK,
4438                         "", HFILL }},
4439
4440                 { &hf_isup_map_type,
4441                         { "Map Type",  "isup.map_type",
4442                         FT_UINT8, BASE_DEC, VALS(isup_map_type_value), FEDCBA_8BIT_MASK,
4443                         "", HFILL }},
4444
4445                 { &hf_isup_automatic_congestion_level,
4446                         { "Automatic congestion level",  "isup.automatic_congestion_level",
4447                         FT_UINT8, BASE_DEC, VALS(isup_auto_congestion_level_value), 0x0,
4448                         "", HFILL }},
4449
4450                 { &hf_isup_inband_information_ind,
4451                         { "In-band information indicator",  "isup.inband_information_ind",
4452                         FT_BOOLEAN, 8, TFS(&isup_inband_information_ind_value), A_8BIT_MASK,
4453                         "", HFILL }},
4454
4455                 { &hf_isup_call_diversion_may_occur_ind,
4456                         { "Call diversion may occur indicator",  "isup.call_diversion_may_occur_ind",
4457                         FT_BOOLEAN, 8, TFS(&isup_call_diversion_may_occur_ind_value), B_8BIT_MASK,
4458                         "", HFILL }},
4459
4460                 { &hf_isup_mlpp_user_ind,
4461                         { "MLPP user indicator",  "isup.mlpp_user",
4462                         FT_BOOLEAN, 8, TFS(&isup_MLPP_user_ind_value), D_8BIT_MASK,
4463                         "", HFILL }},
4464
4465                 { &hf_isup_access_delivery_ind,
4466                         { "Access delivery indicator",  "isup.access_delivery_ind",
4467                         FT_BOOLEAN, 8, TFS(&isup_access_delivery_ind_value), A_8BIT_MASK,
4468                         "", HFILL }},
4469
4470                 { &hf_isup_transmission_medium_requirement_prime,
4471                         { "Transmission medium requirement prime",  "isup.transmission_medium_requirement_prime",
4472                         FT_UINT8, BASE_DEC, VALS(isup_transmission_medium_requirement_prime_value), 0x0,
4473                         "", HFILL }},
4474
4475                 { &hf_isup_loop_prevention_response_ind,
4476                         { "Response indicator",  "isup.loop_prevention_response_ind",
4477                         FT_UINT8, BASE_DEC, VALS(isup_loop_prevention_response_ind_value), CB_8BIT_MASK,
4478                         "", HFILL }},
4479
4480                 { &hf_isup_temporary_alternative_routing_ind,
4481                         { "Temporary alternative routing indicator",  "isup.temporary_alternative_routing_ind",
4482                         FT_BOOLEAN, 8, TFS(&isup_temporary_alternative_routing_ind_value), A_8BIT_MASK,
4483                         "", HFILL }},
4484
4485                 { &hf_isup_extension_ind,
4486                         { "Extension indicator",  "isup.extension_ind",
4487                         FT_BOOLEAN, 8, TFS(&isup_extension_ind_value), H_8BIT_MASK,
4488                         "", HFILL }},
4489
4490                 { &hf_isup_call_to_be_diverted_ind,
4491                         { "Call to be diverted indicator",  "isup.call_to_be_diverted_ind",
4492                         FT_UINT8, BASE_DEC, VALS(isup_call_to_be_diverted_ind_value), BA_8BIT_MASK,
4493                         "", HFILL }},
4494
4495                 { &hf_isup_call_to_be_offered_ind,
4496                         { "Call to be offered indicator",  "isup.call_to_be_offered_ind",
4497                         FT_UINT8, BASE_DEC, VALS(isup_call_to_be_offered_ind_value), BA_8BIT_MASK,
4498                         "", HFILL }},
4499
4500                 { &hf_isup_conference_acceptance_ind,
4501                         { "Conference acceptance indicator",  "isup.conference_acceptance_ind",
4502                         FT_UINT8, BASE_DEC, VALS(isup_conference_acceptance_ind_value), BA_8BIT_MASK,
4503                         "", HFILL }},
4504         };
4505
4506 /* Setup protocol subtree array */
4507         static gint *ett[] = {
4508                 &ett_isup,
4509                 &ett_isup_parameter,
4510                 &ett_isup_address_digits,
4511                 &ett_isup_pass_along_message,
4512                 &ett_isup_circuit_state_ind
4513         };
4514
4515 /* Register the protocol name and description */
4516         proto_isup = proto_register_protocol("ISDN User Part",
4517             "ISUP", "isup");
4518
4519 /* Required function calls to register the header fields and subtrees used */
4520         proto_register_field_array(proto_isup, hf, array_length(hf));
4521         proto_register_subtree_array(ett, array_length(ett));
4522 }
4523
4524
4525 /* ------------------------------------------------------------------ */
4526 /* Register isup with the sub-laying MTP L3 dissector */
4527 void
4528 proto_reg_handoff_isup(void)
4529 {
4530   dissector_handle_t isup_handle;
4531
4532   isup_handle = create_dissector_handle(dissect_isup, proto_isup);
4533   dissector_add("mtp3.service_indicator", MTP3_ISUP_SERVICE_INDICATOR, isup_handle);
4534   dissector_add("m3ua.protocol_data_si", MTP3_ISUP_SERVICE_INDICATOR, isup_handle);
4535 }