Coverage Report

Created: 2025-08-04 07:15

/src/wireshark/epan/dissectors/packet-dua.c
Line
Count
Source (jump to first uncovered line)
1
/* packet-dua.c
2
 * Routines for DPNSS/DASS2-User Adaptation Layer dissection
3
 *
4
 * It is hopefully (needs testing) compliant to
5
 *   https://tools.ietf.org/html/draft-ietf-sigtran-dua-08
6
 *   https://tools.ietf.org/html/draft-ietf-sigtran-rfc3057bis-02
7
 *
8
 * To do: - provide better handling of length parameters
9
 *
10
 * Copyright 2005, Michael Tuexen <tuexen [AT] fh-muenster.de>
11
 *
12
 * Wireshark - Network traffic analyzer
13
 * By Gerald Combs <gerald@wireshark.org>
14
 * Copyright 1998 Gerald Combs
15
 *
16
 * Copied from packet-iua.c
17
 *
18
 * SPDX-License-Identifier: GPL-2.0-or-later
19
 */
20
21
#include "config.h"
22
23
#include <epan/packet.h>
24
#include <epan/sctpppids.h>
25
#include <wsutil/str_util.h>
26
#include <wsutil/ws_roundup.h>
27
28
void proto_register_dua(void);
29
void proto_reg_handoff_dua(void);
30
31
/* Initialize the protocol and registered fields */
32
static int proto_dua;
33
static int hf_int_interface_id;
34
static int hf_text_interface_id;
35
static int hf_info_string;
36
static int hf_dlci_reserved;
37
static int hf_dlci_v_bit;
38
static int hf_dlci_zero_bit;
39
static int hf_dlci_channel;
40
static int hf_dlci_one_bit;
41
static int hf_dlci_spare;
42
static int hf_diag_info;
43
static int hf_interface_range_start;
44
static int hf_interface_range_end;
45
static int hf_heartbeat_data;
46
static int hf_traffic_mode_type;
47
static int hf_error_code;
48
static int hf_status_type;
49
static int hf_status_id;
50
static int hf_release_reason;
51
static int hf_tei_status;
52
static int hf_asp_id;
53
static int hf_states;
54
static int hf_parameter_tag;
55
static int hf_parameter_length;
56
static int hf_parameter_value;
57
static int hf_parameter_padding;
58
static int hf_version;
59
static int hf_reserved;
60
static int hf_message_class;
61
static int hf_message_type;
62
static int hf_message_length;
63
64
/* Initialize the subtree pointers */
65
static int ett_dua;
66
static int ett_dua_parameter;
67
68
static dissector_handle_t dpnss_handle;
69
static dissector_handle_t dua_handle;
70
71
113
#define PARAMETER_TAG_LENGTH    2
72
48
#define PARAMETER_LENGTH_LENGTH 2
73
14
#define PARAMETER_HEADER_LENGTH (PARAMETER_TAG_LENGTH + PARAMETER_LENGTH_LENGTH)
74
75
148
#define PARAMETER_TAG_OFFSET    0
76
82
#define PARAMETER_LENGTH_OFFSET (PARAMETER_TAG_OFFSET + PARAMETER_TAG_LENGTH)
77
17
#define PARAMETER_VALUE_OFFSET  (PARAMETER_LENGTH_OFFSET + PARAMETER_LENGTH_LENGTH)
78
21
#define PARAMETER_HEADER_OFFSET PARAMETER_TAG_OFFSET
79
80
2
#define INT_INTERFACE_ID_OFFSET PARAMETER_VALUE_OFFSET
81
1
#define INT_INTERFACE_ID_LENGTH 4
82
83
static void
84
dissect_int_interface_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
85
1
{
86
1
  proto_tree_add_item(parameter_tree, hf_int_interface_id,
87
1
                      parameter_tvb, INT_INTERFACE_ID_OFFSET, INT_INTERFACE_ID_LENGTH, ENC_BIG_ENDIAN);
88
1
  proto_item_append_text(parameter_item, " (%d)", tvb_get_ntohl(parameter_tvb, INT_INTERFACE_ID_OFFSET));
89
1
}
90
91
0
#define TEXT_INTERFACE_ID_OFFSET PARAMETER_VALUE_OFFSET
92
93
static void
94
dissect_text_interface_identifier_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item)
95
0
{
96
0
  uint16_t interface_id_length;
97
98
0
  interface_id_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
99
100
0
  proto_tree_add_item(parameter_tree, hf_text_interface_id,
101
0
                      parameter_tvb, TEXT_INTERFACE_ID_OFFSET, interface_id_length, ENC_ASCII);
102
0
  proto_item_append_text(parameter_item, " (%s)",
103
0
                         tvb_format_text(pinfo->pool, parameter_tvb, TEXT_INTERFACE_ID_OFFSET, interface_id_length));
104
0
}
105
106
0
#define INFO_STRING_OFFSET PARAMETER_VALUE_OFFSET
107
108
static void
109
dissect_info_string_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item)
110
0
{
111
0
  uint16_t info_string_length;
112
113
0
  info_string_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
114
0
  proto_tree_add_item(parameter_tree, hf_info_string,
115
0
                      parameter_tvb, INFO_STRING_OFFSET, info_string_length, ENC_ASCII);
116
0
  proto_item_append_text(parameter_item, " (%s)",
117
0
                         tvb_format_text(pinfo->pool, parameter_tvb, INFO_STRING_OFFSET, info_string_length));
118
0
}
119
120
0
#define DLCI_LENGTH  2
121
0
#define SPARE_LENGTH 2
122
123
0
#define DLCI_OFFSET  PARAMETER_VALUE_OFFSET
124
0
#define SPARE_OFFSET (DLCI_OFFSET + DLCI_LENGTH)
125
126
14
#define RESERVED_BIT_MASK 0xfe00
127
14
#define V_BIT_MASK        0x0100
128
14
#define ZERO_BIT_MASK     0x0080
129
14
#define CHANNEL_BIT_MASK  0x007e
130
14
#define ONE_BIT_MASK      0x0001
131
132
static void
133
dissect_dlci_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
134
0
{
135
0
  proto_tree_add_item(parameter_tree, hf_dlci_reserved, parameter_tvb, DLCI_OFFSET,  DLCI_LENGTH,  ENC_BIG_ENDIAN);
136
0
  proto_tree_add_item(parameter_tree, hf_dlci_v_bit,    parameter_tvb, DLCI_OFFSET,  DLCI_LENGTH,  ENC_BIG_ENDIAN);
137
0
  proto_tree_add_item(parameter_tree, hf_dlci_zero_bit, parameter_tvb, DLCI_OFFSET,  DLCI_LENGTH,  ENC_BIG_ENDIAN);
138
0
  proto_tree_add_item(parameter_tree, hf_dlci_channel,  parameter_tvb, DLCI_OFFSET,  DLCI_LENGTH,  ENC_BIG_ENDIAN);
139
0
  proto_tree_add_item(parameter_tree, hf_dlci_one_bit,  parameter_tvb, DLCI_OFFSET,  DLCI_LENGTH,  ENC_BIG_ENDIAN);
140
0
  proto_tree_add_item(parameter_tree, hf_dlci_spare,    parameter_tvb, SPARE_OFFSET, SPARE_LENGTH, ENC_BIG_ENDIAN);
141
0
}
142
143
static void
144
dissect_diagnostic_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
145
0
{
146
0
  uint16_t diag_info_length;
147
148
0
  diag_info_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
149
0
  proto_tree_add_item(parameter_tree, hf_diag_info, parameter_tvb, PARAMETER_VALUE_OFFSET, diag_info_length, ENC_NA);
150
0
  proto_item_append_text(parameter_item, " (%u byte%s)", diag_info_length, plurality(diag_info_length, "", "s"));
151
0
}
152
153
212
#define START_LENGTH 4
154
142
#define END_LENGTH   4
155
72
#define INTERVAL_LENGTH (START_LENGTH + END_LENGTH)
156
157
140
#define START_OFFSET 0
158
70
#define END_OFFSET   (START_OFFSET + START_LENGTH)
159
160
static void
161
dissect_integer_range_interface_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
162
2
{
163
2
  uint16_t number_of_ranges, range_number;
164
2
  int offset;
165
166
2
  number_of_ranges = (tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH) / INTERVAL_LENGTH;
167
2
  offset = PARAMETER_VALUE_OFFSET;
168
72
  for(range_number = 0; range_number < number_of_ranges; range_number++) {
169
70
    proto_tree_add_item(parameter_tree, hf_interface_range_start,
170
70
                        parameter_tvb, offset + START_OFFSET, START_LENGTH, ENC_BIG_ENDIAN);
171
70
    proto_tree_add_item(parameter_tree, hf_interface_range_end,
172
70
                        parameter_tvb, offset + END_OFFSET,   END_LENGTH,   ENC_BIG_ENDIAN);
173
70
    offset += INTERVAL_LENGTH;
174
70
  };
175
176
2
  proto_item_append_text(parameter_item, " (%u range%s)", number_of_ranges, plurality(number_of_ranges, "", "s"));
177
2
}
178
179
0
#define HEARTBEAT_DATA_OFFSET PARAMETER_VALUE_OFFSET
180
181
static void
182
dissect_heartbeat_data_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
183
0
{
184
0
  uint16_t heartbeat_data_length;
185
186
0
  heartbeat_data_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
187
0
  proto_tree_add_item(parameter_tree, hf_heartbeat_data,
188
0
                      parameter_tvb, HEARTBEAT_DATA_OFFSET, heartbeat_data_length, ENC_NA);
189
0
  proto_item_append_text(parameter_item, " (%u byte%s)", heartbeat_data_length, plurality(heartbeat_data_length, "", "s"));
190
0
}
191
192
#define OVER_RIDE_TRAFFIC_MODE_TYPE  1
193
#define LOAD_SHARE_TRAFFIC_MODE_TYPE 2
194
195
static const value_string traffic_mode_type_values[] = {
196
  { OVER_RIDE_TRAFFIC_MODE_TYPE,      "Over-ride" },
197
  { LOAD_SHARE_TRAFFIC_MODE_TYPE,     "Load-share" },
198
  { 0,                    NULL } };
199
200
0
#define TRAFFIC_MODE_TYPE_LENGTH 4
201
0
#define TRAFFIC_MODE_TYPE_OFFSET PARAMETER_VALUE_OFFSET
202
203
static void
204
dissect_traffic_mode_type_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
205
0
{
206
0
  proto_tree_add_item(parameter_tree, hf_traffic_mode_type,
207
0
                      parameter_tvb, TRAFFIC_MODE_TYPE_OFFSET, TRAFFIC_MODE_TYPE_LENGTH, ENC_BIG_ENDIAN);
208
0
  proto_item_append_text(parameter_item, " (%s)",
209
0
                         val_to_str_const(tvb_get_ntohl(parameter_tvb, TRAFFIC_MODE_TYPE_OFFSET),
210
0
                                          traffic_mode_type_values, "unknown"));
211
0
}
212
213
#define INVALID_VERSION_ERROR                         0x01
214
#define INVALID_INTERFACE_IDENTIFIER_ERROR            0x02
215
#define UNSUPPORTED_MESSAGE_CLASS_ERROR               0x03
216
#define UNSUPPORTED_MESSAGE_TYPE_ERROR                0x04
217
#define UNSUPPORTED_TRAFFIC_HANDLING_MODE_ERROR       0x05
218
#define UNEXPECTED_MESSAGE_ERROR                      0x06
219
#define PROTOCOL_ERROR                                0x07
220
#define UNSUPPORTED_INTERFACE_IDENTIFIER_TYPE_ERROR   0x08
221
#define INVALID_STREAM_IDENTIFIER_ERROR               0x09
222
#define REFUSED_MANAGEMENT_BLOCKING_ERROR             0x0d
223
#define ASP_IDENTIFIER_REQUIRED_ERROR                 0x0e
224
#define INVALID_ASP_IDENTIFIER_ERROR                  0x0f
225
#define CHANNEL_NUMBER_OUT_OF_RANGE_ERROR             0x1c
226
#define CHANNEL_NUMBER_NOT_CONFIGURED                 0x1d
227
228
static const value_string error_code_values[] = {
229
  { INVALID_VERSION_ERROR,                       "Invalid version" },
230
  { INVALID_INTERFACE_IDENTIFIER_ERROR,          "Invalid interface identifier" },
231
  { UNSUPPORTED_MESSAGE_CLASS_ERROR,             "Unsupported message class" },
232
  { UNSUPPORTED_MESSAGE_TYPE_ERROR,              "Unsupported message type" },
233
  { UNSUPPORTED_TRAFFIC_HANDLING_MODE_ERROR,     "Unsupported traffic handling mode" },
234
  { UNEXPECTED_MESSAGE_ERROR,                    "Unexpected message" },
235
  { PROTOCOL_ERROR,                              "Protocol error" },
236
  { UNSUPPORTED_INTERFACE_IDENTIFIER_TYPE_ERROR, "Unsupported interface identifier type" },
237
  { INVALID_STREAM_IDENTIFIER_ERROR,             "Invalid stream identifier" },
238
  { REFUSED_MANAGEMENT_BLOCKING_ERROR,           "Refused - Management blocking" },
239
  { ASP_IDENTIFIER_REQUIRED_ERROR,               "ASP identifier required" },
240
  { INVALID_ASP_IDENTIFIER_ERROR,                "Invalid ASP Identifier" },
241
  { CHANNEL_NUMBER_OUT_OF_RANGE_ERROR,           "Channel number out of range" },
242
  { CHANNEL_NUMBER_NOT_CONFIGURED,               "Channel number not configured" },
243
  { 0,                                           NULL } };
244
245
0
#define ERROR_CODE_LENGTH 4
246
0
#define ERROR_CODE_OFFSET PARAMETER_VALUE_OFFSET
247
248
static void
249
dissect_error_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
250
0
{
251
0
  proto_tree_add_item(parameter_tree, hf_error_code,
252
0
                      parameter_tvb, ERROR_CODE_OFFSET, ERROR_CODE_LENGTH, ENC_BIG_ENDIAN);
253
0
  proto_item_append_text(parameter_item, " (%s)",
254
0
                         val_to_str_const(tvb_get_ntohl(parameter_tvb, ERROR_CODE_OFFSET),
255
0
                                          error_code_values,
256
0
                                          "unknown"));
257
0
}
258
259
#define ASP_STATE_CHANGE_STATUS_TYPE  0x01
260
#define OTHER_STATUS_TYPE             0x02
261
262
static const value_string status_type_values[] = {
263
  { ASP_STATE_CHANGE_STATUS_TYPE,        "Application server state change" },
264
  { OTHER_STATUS_TYPE,                   "Other" },
265
  { 0,                                   NULL } };
266
267
#define AS_DOWN_STATUS_IDENT          0x01
268
#define AS_INACTIVE_STATUS_IDENT      0x02
269
#define AS_ACTIVE_STATUS_IDENT        0x03
270
#define AS_PENDING_STATUS_IDENT       0x04
271
272
#define INSUFFICIENT_ASP_RESOURCES_STATUS_IDENT 0x01
273
#define ALTERNATE_ASP_ACTIVE_STATUS_IDENT       0x02
274
275
static const value_string status_type_id_values[] = {
276
  { ASP_STATE_CHANGE_STATUS_TYPE * 256 * 256 + AS_DOWN_STATUS_IDENT,         "Application server down" },
277
  { ASP_STATE_CHANGE_STATUS_TYPE * 256 * 256 + AS_INACTIVE_STATUS_IDENT,     "Application server inactive" },
278
  { ASP_STATE_CHANGE_STATUS_TYPE * 256 * 256 + AS_ACTIVE_STATUS_IDENT,       "Application server active" },
279
  { ASP_STATE_CHANGE_STATUS_TYPE * 256 * 256 + AS_PENDING_STATUS_IDENT,      "Application server pending" },
280
  { OTHER_STATUS_TYPE * 256 * 256 + INSUFFICIENT_ASP_RESOURCES_STATUS_IDENT, "Insufficient ASP resources active in AS" },
281
  { OTHER_STATUS_TYPE * 256 * 256 + ALTERNATE_ASP_ACTIVE_STATUS_IDENT,       "Alternate ASP active" },
282
  { 0,                                           NULL } };
283
284
0
#define STATUS_TYPE_LENGTH  2
285
0
#define STATUS_IDENT_LENGTH 2
286
0
#define STATUS_TYPE_OFFSET  PARAMETER_VALUE_OFFSET
287
0
#define STATUS_IDENT_OFFSET (STATUS_TYPE_OFFSET + STATUS_TYPE_LENGTH)
288
289
static void
290
dissect_status_type_identification_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
291
0
{
292
0
  uint16_t status_type, status_id;
293
294
0
  status_type = tvb_get_ntohs(parameter_tvb, STATUS_TYPE_OFFSET);
295
0
  status_id   = tvb_get_ntohs(parameter_tvb, STATUS_IDENT_OFFSET);
296
297
0
  proto_tree_add_item(parameter_tree, hf_status_type,
298
0
                      parameter_tvb, STATUS_TYPE_OFFSET, STATUS_TYPE_LENGTH, ENC_BIG_ENDIAN);
299
0
  proto_tree_add_uint_format_value(parameter_tree, hf_status_id,  parameter_tvb, STATUS_IDENT_OFFSET, STATUS_IDENT_LENGTH,
300
0
                             status_id, "%u (%s)", status_id,
301
0
                             val_to_str_const(status_type * 256 * 256 + status_id, status_type_id_values, "unknown"));
302
303
0
  proto_item_append_text(parameter_item, " (%s)",
304
0
                         val_to_str_const(status_type * 256 * 256 + status_id,
305
0
                                          status_type_id_values,
306
0
                                          "unknown status information"));
307
0
}
308
309
1
#define PROTOCOL_DATA_OFFSET PARAMETER_VALUE_OFFSET
310
311
static void
312
dissect_protocol_data_parameter(tvbuff_t *parameter_tvb, proto_item *parameter_item, packet_info *pinfo, proto_tree *tree)
313
1
{
314
1
  uint16_t protocol_data_length;
315
1
  tvbuff_t *protocol_data_tvb;
316
317
1
  protocol_data_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
318
1
  protocol_data_tvb    = tvb_new_subset_length(parameter_tvb, PROTOCOL_DATA_OFFSET, protocol_data_length);
319
1
  if(dpnss_handle){
320
1
    call_dissector(dpnss_handle, protocol_data_tvb, pinfo, tree);
321
1
    return;
322
1
  }
323
324
0
  call_data_dissector(protocol_data_tvb, pinfo, tree);
325
326
0
  proto_item_append_text(parameter_item, " (%u byte%s)", protocol_data_length, plurality(protocol_data_length, "", "s"));
327
0
}
328
329
#define RELEASE_MGMT_REASON   0
330
#define RELEASE_PHYS_REASON   1
331
#define RELEASE_DM_REASON     2
332
#define RELEASE_OTHER_REASON  3
333
334
static const value_string release_reason_values[] = {
335
  { RELEASE_MGMT_REASON,  "Management layer generated release" },
336
  { RELEASE_PHYS_REASON,  "Physical layer alarm generated release" },
337
  { RELEASE_DM_REASON,    "Layer 2 should release" },
338
  { RELEASE_OTHER_REASON, "Other reason" },
339
  { 0,                    NULL } };
340
341
2
#define RELEASE_REASON_OFFSET PARAMETER_VALUE_OFFSET
342
1
#define RELEASE_REASON_LENGTH 4
343
344
static void
345
dissect_release_reason_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
346
1
{
347
1
  proto_tree_add_item(parameter_tree, hf_release_reason,
348
1
                      parameter_tvb, RELEASE_REASON_OFFSET, RELEASE_REASON_LENGTH, ENC_BIG_ENDIAN);
349
1
  proto_item_append_text(parameter_item, " (%s)",
350
1
                         val_to_str_const(tvb_get_ntohl(parameter_tvb, RELEASE_REASON_OFFSET),
351
1
                                          release_reason_values,
352
1
                                          "unknown"));
353
1
}
354
355
#define TEI_STATUS_ASSIGNED       0
356
#define TEI_STATUS_UNASSIGNED     1
357
358
static const value_string tei_status_values[] = {
359
  { TEI_STATUS_ASSIGNED,   "TEI is considered assigned by Q.921" },
360
  { TEI_STATUS_UNASSIGNED, "TEI is considered unassigned by Q.921" },
361
  { 0,                    NULL } };
362
363
0
#define TEI_STATUS_LENGTH 4
364
0
#define TEI_STATUS_OFFSET PARAMETER_VALUE_OFFSET
365
366
static void
367
dissect_tei_status_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
368
0
{
369
0
  proto_tree_add_item(parameter_tree, hf_tei_status,
370
0
                      parameter_tvb, TEI_STATUS_OFFSET, TEI_STATUS_LENGTH, ENC_BIG_ENDIAN);
371
0
  proto_item_append_text(parameter_item, " (%s)",
372
0
                      val_to_str_const(tvb_get_ntohl(parameter_tvb, TEI_STATUS_OFFSET),
373
0
                                       tei_status_values,
374
0
                                       "unknown"));
375
0
}
376
377
0
#define ASP_ID_LENGTH 4
378
0
#define ASP_ID_OFFSET PARAMETER_VALUE_OFFSET
379
380
static void
381
dissect_asp_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
382
0
{
383
0
  proto_tree_add_item(parameter_tree, hf_asp_id, parameter_tvb, ASP_ID_OFFSET, ASP_ID_LENGTH, ENC_BIG_ENDIAN);
384
0
  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, ASP_ID_OFFSET));
385
0
}
386
387
static void
388
dissect_dlc_status_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item _U_)
389
0
{
390
0
  uint16_t parameter_value_length;
391
392
  /* FIXME: This can be done better */
393
0
  parameter_value_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
394
0
  if (parameter_value_length > 0)
395
0
    proto_tree_add_item(parameter_tree,
396
0
                        hf_states, parameter_tvb, PARAMETER_VALUE_OFFSET, parameter_value_length, ENC_NA);
397
0
}
398
399
static void
400
dissect_unknown_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
401
11
{
402
11
  uint16_t parameter_value_length;
403
404
11
  parameter_value_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
405
11
  if (parameter_value_length > 0)
406
10
    proto_tree_add_item(parameter_tree, hf_parameter_value,
407
10
                        parameter_tvb, PARAMETER_VALUE_OFFSET, parameter_value_length, ENC_NA);
408
11
  proto_item_append_text(parameter_item, " with tag %u and %u byte%s value",
409
11
                         tvb_get_ntohs(parameter_tvb, PARAMETER_TAG_OFFSET),
410
11
                         parameter_value_length, plurality(parameter_value_length, "", "s"));
411
11
}
412
413
1
#define INT_INTERFACE_IDENTIFIER_PARAMETER_TAG           0x01
414
0
#define TEXT_INTERFACE_IDENTIFIER_PARAMETER_TAG          0x03
415
0
#define INFO_PARAMETER_TAG                               0x04
416
0
#define DLCI_PARAMETER_TAG                               0x05
417
0
#define DIAGNOSTIC_INFORMATION_PARAMETER_TAG             0x07
418
2
#define INTEGER_RANGE_INTERFACE_IDENTIFIER_PARAMETER_TAG 0x08
419
0
#define HEARTBEAT_DATA_PARAMETER_TAG                     0x09
420
0
#define TRAFFIC_MODE_TYPE_PARAMETER_TAG                  0x0b
421
0
#define ERROR_CODE_PARAMETER_TAG                         0x0c
422
0
#define STATUS_TYPE_INDENTIFICATION_PARAMETER_TAG        0x0d
423
1
#define PROTOCOL_DATA_PARAMETER_TAG                      0x0e
424
1
#define RELEASE_REASON_PARAMETER_TAG                     0x0f
425
0
#define TEI_STATUS_PARAMETER_TAG                         0x10
426
0
#define ASP_IDENTIFIER_PARAMETER_TAG                     0x11
427
0
#define DLC_STATUS_PARAMETER_TAG                         0x12
428
429
static const value_string parameter_tag_values[] = {
430
  { INT_INTERFACE_IDENTIFIER_PARAMETER_TAG,                "Integer interface identifier" },
431
  { TEXT_INTERFACE_IDENTIFIER_PARAMETER_TAG,               "Text interface identifier" },
432
  { INFO_PARAMETER_TAG,                                    "Info" },
433
  { DLCI_PARAMETER_TAG,                                    "DLCI" },
434
  { DIAGNOSTIC_INFORMATION_PARAMETER_TAG,                  "Diagnostic information" },
435
  { INTEGER_RANGE_INTERFACE_IDENTIFIER_PARAMETER_TAG,      "Integer range interface identifier" },
436
  { HEARTBEAT_DATA_PARAMETER_TAG,                          "Heartbeat data" },
437
  { TRAFFIC_MODE_TYPE_PARAMETER_TAG,                       "Traffic mode type" },
438
  { ERROR_CODE_PARAMETER_TAG,                              "Error code" },
439
  { STATUS_TYPE_INDENTIFICATION_PARAMETER_TAG,             "Status type/identification" },
440
  { PROTOCOL_DATA_PARAMETER_TAG,                           "Protocol data" },
441
  { RELEASE_REASON_PARAMETER_TAG,                          "Reason" },
442
  { TEI_STATUS_PARAMETER_TAG,                              "TEI status" },
443
  { ASP_IDENTIFIER_PARAMETER_TAG,                          "ASP identifier"},
444
  { DLC_STATUS_PARAMETER_TAG,                              "DLC status" },
445
  { 0,                                                     NULL } };
446
447
static void
448
dissect_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *tree, proto_tree *dua_tree)
449
17
{
450
17
  uint16_t tag, length, padding_length;
451
17
  proto_item *parameter_item;
452
17
  proto_tree *parameter_tree;
453
454
  /* extract tag and length from the parameter */
455
17
  tag            = tvb_get_ntohs(parameter_tvb, PARAMETER_TAG_OFFSET);
456
17
  length         = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
457
17
  padding_length = tvb_reported_length(parameter_tvb) - length;
458
459
  /* create proto_tree stuff */
460
17
  parameter_tree   = proto_tree_add_subtree(dua_tree, parameter_tvb, PARAMETER_HEADER_OFFSET,
461
17
                                         -1, ett_dua_parameter, &parameter_item,
462
17
                                         val_to_str_const(tag, parameter_tag_values, "Unknown parameter"));
463
464
  /* add tag and length to the dua tree */
465
17
  proto_tree_add_item(parameter_tree, hf_parameter_tag,
466
17
                      parameter_tvb, PARAMETER_TAG_OFFSET, PARAMETER_TAG_LENGTH, ENC_BIG_ENDIAN);
467
17
  proto_tree_add_item(parameter_tree, hf_parameter_length,
468
17
                      parameter_tvb, PARAMETER_LENGTH_OFFSET, PARAMETER_LENGTH_LENGTH, ENC_BIG_ENDIAN);
469
470
17
  switch(tag) {
471
1
  case INT_INTERFACE_IDENTIFIER_PARAMETER_TAG:
472
1
    dissect_int_interface_identifier_parameter(parameter_tvb, parameter_tree, parameter_item);
473
1
    break;
474
0
  case TEXT_INTERFACE_IDENTIFIER_PARAMETER_TAG:
475
0
    dissect_text_interface_identifier_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item);
476
0
    break;
477
0
  case INFO_PARAMETER_TAG:
478
0
    dissect_info_string_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item);
479
0
    break;
480
0
  case DLCI_PARAMETER_TAG:
481
0
    dissect_dlci_parameter(parameter_tvb, parameter_tree);
482
0
    break;
483
0
  case DIAGNOSTIC_INFORMATION_PARAMETER_TAG:
484
0
    dissect_diagnostic_information_parameter(parameter_tvb, parameter_tree, parameter_item);
485
0
    break;
486
2
  case INTEGER_RANGE_INTERFACE_IDENTIFIER_PARAMETER_TAG:
487
2
    dissect_integer_range_interface_identifier_parameter(parameter_tvb, parameter_tree, parameter_item);
488
2
    break;
489
0
  case HEARTBEAT_DATA_PARAMETER_TAG:
490
0
    dissect_heartbeat_data_parameter(parameter_tvb, parameter_tree, parameter_item);
491
0
    break;
492
0
  case TRAFFIC_MODE_TYPE_PARAMETER_TAG:
493
0
    dissect_traffic_mode_type_parameter(parameter_tvb, parameter_tree, parameter_item);
494
0
    break;
495
0
  case ERROR_CODE_PARAMETER_TAG:
496
0
    dissect_error_code_parameter(parameter_tvb, parameter_tree, parameter_item);
497
0
    break;
498
0
  case STATUS_TYPE_INDENTIFICATION_PARAMETER_TAG:
499
0
    dissect_status_type_identification_parameter(parameter_tvb, parameter_tree, parameter_item);
500
0
    break;
501
1
  case PROTOCOL_DATA_PARAMETER_TAG:
502
1
    dissect_protocol_data_parameter(parameter_tvb, parameter_item, pinfo, tree);
503
1
    break;
504
1
  case RELEASE_REASON_PARAMETER_TAG:
505
1
    dissect_release_reason_parameter(parameter_tvb, parameter_tree, parameter_item);
506
1
    break;
507
0
  case TEI_STATUS_PARAMETER_TAG:
508
0
    dissect_tei_status_parameter(parameter_tvb, parameter_tree, parameter_item);
509
0
    break;
510
0
  case ASP_IDENTIFIER_PARAMETER_TAG:
511
0
    dissect_asp_identifier_parameter(parameter_tvb, parameter_tree, parameter_item);
512
0
    break;
513
0
  case DLC_STATUS_PARAMETER_TAG:
514
0
    dissect_dlc_status_parameter(parameter_tvb, parameter_tree, parameter_item);
515
0
    break;
516
11
  default:
517
11
    dissect_unknown_parameter(parameter_tvb, parameter_tree, parameter_item);
518
11
    break;
519
17
  };
520
521
9
  if (padding_length > 0)
522
4
    proto_tree_add_item(parameter_tree, hf_parameter_padding,
523
4
                        parameter_tvb, PARAMETER_HEADER_OFFSET + length, padding_length, ENC_NA);
524
9
}
525
526
static void
527
dissect_parameters(tvbuff_t *parameters_tvb, packet_info *pinfo, proto_tree *tree, proto_tree *dua_tree)
528
11
{
529
11
  int offset, length, total_length, remaining_length;
530
11
  tvbuff_t *parameter_tvb;
531
532
11
  offset = 0;
533
28
  while((remaining_length = tvb_reported_length_remaining(parameters_tvb, offset))) {
534
17
    length       = tvb_get_ntohs(parameters_tvb, offset + PARAMETER_LENGTH_OFFSET);
535
17
    total_length = WS_ROUNDUP_4(length);
536
17
    if (remaining_length >= length)
537
8
      total_length = MIN(total_length, remaining_length);
538
    /* create a tvb for the parameter including the padding bytes */
539
17
    parameter_tvb  = tvb_new_subset_length(parameters_tvb, offset, total_length);
540
17
    dissect_parameter(parameter_tvb, pinfo, tree, dua_tree);
541
    /* get rid of the handled parameter */
542
17
    offset += total_length;
543
17
  }
544
11
}
545
546
99
#define VERSION_LENGTH         1
547
88
#define RESERVED_LENGTH        1
548
66
#define MESSAGE_CLASS_LENGTH   1
549
44
#define MESSAGE_TYPE_LENGTH    1
550
33
#define MESSAGE_LENGTH_LENGTH  4
551
22
#define COMMON_HEADER_LENGTH   (VERSION_LENGTH + RESERVED_LENGTH + MESSAGE_CLASS_LENGTH + \
552
22
                                MESSAGE_TYPE_LENGTH + MESSAGE_LENGTH_LENGTH)
553
554
99
#define COMMON_HEADER_OFFSET   0
555
77
#define VERSION_OFFSET         COMMON_HEADER_OFFSET
556
66
#define RESERVED_OFFSET        (VERSION_OFFSET + VERSION_LENGTH)
557
55
#define MESSAGE_CLASS_OFFSET   (RESERVED_OFFSET + RESERVED_LENGTH)
558
33
#define MESSAGE_TYPE_OFFSET    (MESSAGE_CLASS_OFFSET + MESSAGE_CLASS_LENGTH)
559
11
#define MESSAGE_LENGTH_OFFSET  (MESSAGE_TYPE_OFFSET + MESSAGE_TYPE_LENGTH)
560
11
#define PARAMETERS_OFFSET      (COMMON_HEADER_OFFSET + COMMON_HEADER_LENGTH)
561
562
#define PROTOCOL_VERSION_RELEASE_1             1
563
564
static const value_string protocol_version_values[] = {
565
  { PROTOCOL_VERSION_RELEASE_1,  "Release 1" },
566
  { 0,                           NULL } };
567
568
#define MESSAGE_CLASS_MGMT_MESSAGE        0
569
#define MESSAGE_CLASS_ASPSM_MESSAGE       3
570
#define MESSAGE_CLASS_ASPTM_MESSAGE       4
571
#define MESSAGE_CLASS_DPTM_MESSAGE       13
572
573
static const value_string message_class_values[] = {
574
  { MESSAGE_CLASS_MGMT_MESSAGE,   "Management messages" },
575
  { MESSAGE_CLASS_ASPSM_MESSAGE,  "ASP state maintenance messages" },
576
  { MESSAGE_CLASS_ASPTM_MESSAGE,  "ASP traffic maintenance messages" },
577
  { MESSAGE_CLASS_DPTM_MESSAGE,   "DPNSS/DASS2 boundary primitive transport messages" },
578
  { 0,                             NULL } };
579
580
/* message types for MGMT messages */
581
#define MESSAGE_TYPE_ERR                  0
582
#define MESSAGE_TYPE_NTFY                 1
583
#define MESSAGE_TYPE_DLC_STAT_REQ         5
584
#define MESSAGE_TYPE_DLC_STAT_CON         6
585
#define MESSAGE_TYPE_DLC_STAT_IND         7
586
587
/* message types for ASPSM messages */
588
#define MESSAGE_TYPE_UP                   1
589
#define MESSAGE_TYPE_DOWN                 2
590
#define MESSAGE_TYPE_BEAT                 3
591
#define MESSAGE_TYPE_UP_ACK               4
592
#define MESSAGE_TYPE_DOWN_ACK             5
593
#define MESSAGE_TYPE_BEAT_ACK             6
594
595
/* message types for ASPTM messages */
596
#define MESSAGE_TYPE_ACTIVE               1
597
#define MESSAGE_TYPE_INACTIVE             2
598
#define MESSAGE_TYPE_ACTIVE_ACK           3
599
#define MESSAGE_TYPE_INACTIVE_ACK         4
600
601
/* message types for DPTM messages */
602
#define MESSAGE_TYPE_DATA_REQUEST         1
603
#define MESSAGE_TYPE_DATA_INDICATION      2
604
#define MESSAGE_TYPE_ESTABLISH_REQUEST    5
605
#define MESSAGE_TYPE_ESTABLISH_CONFIRM    6
606
#define MESSAGE_TYPE_ESTABLISH_INDICATION 7
607
#define MESSAGE_TYPE_RELEASE_REQUEST      8
608
#define MESSAGE_TYPE_RELEASE_CONFIRM      9
609
#define MESSAGE_TYPE_RELEASE_INDICATION  10
610
611
612
static const value_string message_class_type_values[] = {
613
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_ERR,                  "Error" },
614
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_NTFY,                 "Notify" },
615
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_DLC_STAT_REQ,         "DLC status request" },
616
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_DLC_STAT_CON,         "DLC status confirm" },
617
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_DLC_STAT_IND,         "DLC status indication" },
618
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_UP,                   "ASP up" },
619
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_DOWN,                 "ASP down" },
620
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_BEAT,                 "Heartbeat" },
621
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_UP_ACK,               "ASP up ack" },
622
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_DOWN_ACK,             "ASP down ack" },
623
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_BEAT_ACK,             "Heartbeat ack" },
624
  { MESSAGE_CLASS_ASPTM_MESSAGE * 256 + MESSAGE_TYPE_ACTIVE ,              "ASP active" },
625
  { MESSAGE_CLASS_ASPTM_MESSAGE * 256 + MESSAGE_TYPE_INACTIVE ,            "ASP inactive" },
626
  { MESSAGE_CLASS_ASPTM_MESSAGE * 256 + MESSAGE_TYPE_ACTIVE_ACK ,          "ASP active ack" },
627
  { MESSAGE_CLASS_ASPTM_MESSAGE * 256 + MESSAGE_TYPE_INACTIVE_ACK ,        "ASP inactive ack" },
628
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_DATA_REQUEST,         "Data request" },
629
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_DATA_INDICATION,      "Data indication" },
630
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_ESTABLISH_REQUEST,    "Establish request" },
631
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_ESTABLISH_CONFIRM,    "Establish confirmation" },
632
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_ESTABLISH_INDICATION, "Establish indication" },
633
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_RELEASE_REQUEST,      "Release request" },
634
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_RELEASE_CONFIRM,      "Release confirmation" },
635
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_RELEASE_INDICATION,   "Release indication" },
636
  { 0,                                                                     NULL } };
637
638
static const value_string message_class_type_acro_values[] = {
639
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_ERR,                  "ERR" },
640
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_NTFY,                 "NTFY" },
641
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_DLC_STAT_REQ,         "DLC_STAT_REQ" },
642
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_DLC_STAT_CON,         "DLC_STAT_CON" },
643
  { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_DLC_STAT_IND,         "DLC_STAT_IND" },
644
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_UP,                   "ASP_UP" },
645
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_DOWN,                 "ASP_DOWN" },
646
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_BEAT,                 "BEAT" },
647
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_UP_ACK,               "ASP_UP_ACK" },
648
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_DOWN_ACK,             "ASP_DOWN_ACK" },
649
  { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_BEAT_ACK,             "BEAT_ACK" },
650
  { MESSAGE_CLASS_ASPTM_MESSAGE * 256 + MESSAGE_TYPE_ACTIVE ,              "ASP_ACTIVE" },
651
  { MESSAGE_CLASS_ASPTM_MESSAGE * 256 + MESSAGE_TYPE_INACTIVE ,            "ASP_INACTIVE" },
652
  { MESSAGE_CLASS_ASPTM_MESSAGE * 256 + MESSAGE_TYPE_ACTIVE_ACK ,          "ASP_ACTIVE_ACK" },
653
  { MESSAGE_CLASS_ASPTM_MESSAGE * 256 + MESSAGE_TYPE_INACTIVE_ACK ,        "ASP_INACTIVE_ACK" },
654
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_DATA_REQUEST,         "DATA_REQ" },
655
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_DATA_INDICATION,      "DATA_IND" },
656
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_ESTABLISH_REQUEST,    "EST_REQ" },
657
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_ESTABLISH_CONFIRM,    "EST_CON" },
658
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_ESTABLISH_INDICATION, "EST_IND" },
659
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_RELEASE_REQUEST,      "REL_REQ" },
660
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_RELEASE_CONFIRM,      "REL_CON" },
661
  { MESSAGE_CLASS_DPTM_MESSAGE  * 256 + MESSAGE_TYPE_RELEASE_INDICATION,   "REL_IND" },
662
  { 0,                                                                     NULL } };
663
664
static void
665
dissect_common_header(tvbuff_t *common_header_tvb, packet_info *pinfo, proto_tree *dua_tree)
666
11
{
667
11
  uint8_t message_class, message_type;
668
669
11
  message_class  = tvb_get_uint8(common_header_tvb, MESSAGE_CLASS_OFFSET);
670
11
  message_type   = tvb_get_uint8(common_header_tvb, MESSAGE_TYPE_OFFSET);
671
672
11
  col_add_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str_const(message_class * 256 + message_type,
673
11
                                                                 message_class_type_acro_values,
674
11
                                                                 "Unknown"));
675
676
11
  if (dua_tree) {
677
    /* add the components of the common header to the protocol tree */
678
11
    proto_tree_add_item(dua_tree, hf_version, common_header_tvb, VERSION_OFFSET, VERSION_LENGTH, ENC_BIG_ENDIAN);
679
11
    proto_tree_add_item(dua_tree, hf_reserved, common_header_tvb, RESERVED_OFFSET, RESERVED_LENGTH, ENC_BIG_ENDIAN);
680
11
    proto_tree_add_item(dua_tree, hf_message_class,
681
11
                        common_header_tvb, MESSAGE_CLASS_OFFSET, MESSAGE_CLASS_LENGTH, ENC_BIG_ENDIAN);
682
11
    proto_tree_add_uint_format_value(dua_tree, hf_message_type,
683
11
                               common_header_tvb, MESSAGE_TYPE_OFFSET, MESSAGE_TYPE_LENGTH,
684
11
                               message_type, "%u (%s)",
685
11
                               message_type, val_to_str_const(message_class * 256 + message_type,
686
11
                                                              message_class_type_values,
687
11
                                                              "reserved"));
688
11
    proto_tree_add_item(dua_tree, hf_message_length,
689
11
                        common_header_tvb, MESSAGE_LENGTH_OFFSET, MESSAGE_LENGTH_LENGTH, ENC_BIG_ENDIAN);
690
11
  }
691
11
}
692
693
static void
694
dissect_dua_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *tree, proto_tree *dua_tree)
695
11
{
696
11
  tvbuff_t *common_header_tvb, *parameters_tvb;
697
698
11
  common_header_tvb = tvb_new_subset_length(message_tvb, COMMON_HEADER_OFFSET, COMMON_HEADER_LENGTH);
699
11
  parameters_tvb    = tvb_new_subset_remaining(message_tvb, PARAMETERS_OFFSET);
700
11
  dissect_common_header(common_header_tvb, pinfo, dua_tree);
701
11
  dissect_parameters(parameters_tvb, pinfo, tree, dua_tree);
702
11
}
703
704
static int
705
dissect_dua(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
706
11
{
707
11
  proto_item *dua_item;
708
11
  proto_tree *dua_tree;
709
710
  /* make entry in the Protocol column on summary display */
711
11
  col_set_str(pinfo->cinfo, COL_PROTOCOL, "DUA");
712
713
  /* create the m3ua protocol tree */
714
11
  dua_item = proto_tree_add_item(tree, proto_dua, message_tvb, 0, -1, ENC_NA);
715
11
  dua_tree = proto_item_add_subtree(dua_item, ett_dua);
716
717
  /* dissect the message */
718
11
  dissect_dua_message(message_tvb, pinfo, tree, dua_tree);
719
11
  return tvb_captured_length(message_tvb);
720
11
}
721
722
/* Register the protocol with Wireshark */
723
void
724
proto_register_dua(void)
725
14
{
726
727
  /* Setup list of header fields */
728
14
  static hf_register_info hf[] = {
729
14
    { &hf_int_interface_id,
730
14
      { "Integer interface identifier", "dua.int_interface_identifier",
731
14
        FT_UINT32,   BASE_HEX,  NULL,                          0x0,
732
14
        NULL, HFILL } },
733
734
14
    { &hf_text_interface_id,
735
14
      { "Text interface identifier",    "dua.text_interface_identifier",
736
14
        FT_STRING,  BASE_NONE, NULL,                           0x0,
737
14
        NULL, HFILL } },
738
739
14
    { &hf_info_string,
740
14
      { "Info string",                  "dua.info_string",
741
14
        FT_STRING,  BASE_NONE, NULL,                           0x0,
742
14
        NULL, HFILL } },
743
744
14
    { &hf_dlci_reserved,
745
14
      { "Reserved",                     "dua.dlci_reserved",
746
14
        FT_UINT16,  BASE_DEC,  NULL,                           RESERVED_BIT_MASK,
747
14
        NULL, HFILL } },
748
749
14
    { &hf_dlci_v_bit,
750
14
      { "V-bit",                        "dua.dlci_v_bit",
751
14
        FT_BOOLEAN, 16,        NULL,                           V_BIT_MASK,
752
14
        NULL, HFILL } },
753
754
14
    { &hf_dlci_zero_bit,
755
14
      { "Zero bit",                     "dua.dlci_zero_bit",
756
14
        FT_BOOLEAN, 16,        NULL,                           ZERO_BIT_MASK,
757
14
        NULL, HFILL } },
758
759
14
    { &hf_dlci_channel,
760
14
      { "Channel",                      "dua.dlci_channel",
761
14
        FT_UINT16,   BASE_DEC, NULL,                           CHANNEL_BIT_MASK,
762
14
        NULL, HFILL } },
763
764
14
    { &hf_dlci_one_bit,
765
14
      { "One bit",                      "dua.dlci_one_bit",
766
14
        FT_BOOLEAN, 16,        NULL,                           ONE_BIT_MASK,
767
14
        NULL, HFILL } },
768
769
14
    { &hf_dlci_spare,
770
14
      { "Spare",                        "dua.dlci_spare",
771
14
        FT_UINT16,  BASE_DEC,  NULL,                           0x0,
772
14
        NULL, HFILL } },
773
774
14
    { &hf_diag_info,
775
14
      { "Diagnostic information",       "dua.diagnostic_information",
776
14
        FT_BYTES,   BASE_NONE, NULL,                           0x0,
777
14
        NULL, HFILL } },
778
779
14
    { &hf_interface_range_start,
780
14
      { "Start",                        "dua.interface_range_start",
781
14
        FT_UINT32,  BASE_DEC,  NULL,                           0x0,
782
14
        NULL, HFILL } },
783
784
14
    { &hf_interface_range_end,
785
14
      { "End",                          "dua.interface_range_end",
786
14
        FT_UINT32,  BASE_DEC,  NULL,                           0x0,
787
14
        NULL, HFILL } },
788
789
14
    { &hf_heartbeat_data,
790
14
      { "Heartbeat data",               "dua.heartbeat_data",
791
14
        FT_BYTES,   BASE_NONE, NULL,                           0x0,
792
14
        NULL, HFILL } },
793
794
14
    { &hf_traffic_mode_type,
795
14
      { "Traffic mode type",            "dua.traffic_mode_type",
796
14
        FT_UINT32,  BASE_HEX,  VALS(traffic_mode_type_values), 0x0,
797
14
        NULL, HFILL } },
798
799
14
    { &hf_error_code,
800
14
      { "Error code",                   "dua.error_code",
801
14
        FT_UINT32,  BASE_DEC,  VALS(error_code_values),        0x0,
802
14
        NULL, HFILL } },
803
804
14
    { &hf_status_type,
805
14
      { "Status type",                  "dua.status_type",
806
14
        FT_UINT16,  BASE_DEC,  VALS(status_type_values),       0x0,
807
14
        NULL, HFILL } },
808
809
14
    { &hf_status_id,
810
14
      { "Status identification",        "dua.status_identification",
811
14
        FT_UINT16,  BASE_DEC,  NULL,                           0x0,
812
14
        NULL, HFILL } },
813
814
14
    { &hf_release_reason,
815
14
      { "Reason",                       "dua.release_reason",
816
14
        FT_UINT32,  BASE_HEX,  VALS(release_reason_values),    0x0,
817
14
        NULL, HFILL } },
818
819
14
    { &hf_tei_status,
820
14
      { "TEI status",                   "dua.tei_status",
821
14
        FT_UINT32,  BASE_HEX,  VALS(tei_status_values),        0x0,
822
14
        NULL, HFILL } },
823
824
14
    { &hf_asp_id,
825
14
      { "ASP identifier",               "dua.asp_identifier",
826
14
        FT_UINT32,  BASE_HEX,  NULL,                           0x0,
827
14
        NULL, HFILL } },
828
829
14
    { &hf_states,
830
14
      { "States",                       "dua.states",
831
14
        FT_BYTES,   BASE_NONE, NULL,                           0x0,
832
14
        NULL, HFILL } },
833
834
14
    { &hf_parameter_tag,
835
14
      { "Parameter Tag",                "dua.parameter_tag",
836
14
        FT_UINT16,  BASE_DEC,  VALS(parameter_tag_values),     0x0,
837
14
        NULL, HFILL } },
838
839
14
    { &hf_parameter_length,
840
14
      { "Parameter length",             "dua.parameter_length",
841
14
        FT_UINT16,  BASE_DEC,  NULL,                           0x0,
842
14
        NULL, HFILL } },
843
844
14
    { &hf_parameter_value,
845
14
      { "Parameter value",              "dua.parameter_value",
846
14
        FT_BYTES,   BASE_NONE, NULL,                           0x0,
847
14
        NULL, HFILL } },
848
849
14
    { &hf_parameter_padding,
850
14
      { "Parameter padding",            "dua.parameter_padding",
851
14
        FT_BYTES,   BASE_NONE, NULL,                           0x0,
852
14
        NULL, HFILL } },
853
854
14
    { &hf_version,
855
14
      { "Version",                      "dua.version",
856
14
        FT_UINT8,   BASE_DEC,  VALS(protocol_version_values),  0x0,
857
14
        NULL, HFILL } },
858
859
14
    { &hf_reserved,
860
14
      { "Reserved",                     "dua.reserved",
861
14
        FT_UINT8,   BASE_HEX,  NULL,                           0x0,
862
14
        NULL, HFILL } },
863
864
14
    { &hf_message_class,
865
14
      { "Message class",                "dua.message_class",
866
14
        FT_UINT8,   BASE_DEC,  VALS(message_class_values),     0x0,
867
14
        NULL, HFILL } },
868
869
14
    { &hf_message_type,
870
14
      { "Message Type",                 "dua.message_type",
871
14
        FT_UINT8,   BASE_DEC,  NULL,                           0x0,
872
14
        NULL, HFILL } },
873
874
14
    { &hf_message_length,
875
14
      { "Message length",               "dua.message_length",
876
14
        FT_UINT32,  BASE_DEC,  NULL,                           0x0,
877
14
        NULL, HFILL } },
878
879
14
   };
880
  /* Setup protocol subtree array */
881
14
  static int *ett[] = {
882
14
    &ett_dua,
883
14
    &ett_dua_parameter,
884
14
  };
885
886
  /* Register the protocol name and description */
887
14
  proto_dua = proto_register_protocol("DPNSS/DASS2-User Adaptation Layer", "DUA", "dua");
888
889
  /* Required function calls to register the header fields and subtrees used */
890
14
  proto_register_field_array(proto_dua, hf, array_length(hf));
891
14
  proto_register_subtree_array(ett, array_length(ett));
892
893
  /* Allow other dissectors to find this one by name. */
894
14
  dua_handle = register_dissector("dua", dissect_dua, proto_dua);
895
14
}
896
897
void
898
proto_reg_handoff_dua(void)
899
14
{
900
14
  dpnss_handle = find_dissector_add_dependency("dpnss", proto_dua);
901
14
  dissector_add_uint("sctp.ppi", DUA_PAYLOAD_PROTOCOL_ID, dua_handle);
902
14
}
903
904
/*
905
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
906
 *
907
 * Local Variables:
908
 * c-basic-offset: 2
909
 * tab-width: 8
910
 * indent-tabs-mode: nil
911
 * End:
912
 *
913
 * ex: set shiftwidth=2 tabstop=8 expandtab:
914
 * :indentSize=2:tabSize=8:noTabs=true:
915
 */