MSWSP: fix dissect_mswsp_smb()
[wireshark-wip.git] / epan / dissectors / packet-alcap.c
blob66b88733014a25a81fe869e345ed5ac7acfc6889
1 /* packet-alcap.c
2 * Routines for ALCAP (Q.2630.3) dissection
3 * AAL type 2 signalling protocol - Capability set 3
4 * 10/2003
6 * Copyright 2003, Michael Lum <mlum [AT] telostech.com>
7 * In association with Telos Technology Inc.
9 * Copyright 2005, Luis E. Garcia Ontanon <luis.ontanon [AT] gmail.com>
11 * $Id$
13 * Wireshark - Network traffic analyzer
14 * By Gerald Combs <gerald@wireshark.org>
15 * Copyright 1998 Gerald Combs
17 * This program is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU General Public License
19 * as published by the Free Software Foundation; either version 2
20 * of the License, or (at your option) any later version.
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
32 #include "config.h"
34 #include <glib.h>
36 #include <wsutil/str_util.h>
38 #include <epan/packet.h>
39 #include <epan/wmem/wmem.h>
40 #include <epan/prefs.h>
41 #include "packet-alcap.h"
42 #include "packet-mtp3.h"
43 #include <epan/dissectors/packet-isup.h>
44 #include <epan/expert.h>
46 void proto_register_alcap(void);
47 void proto_reg_handoff_alcap(void);
49 #define ALCAP_MSG_HEADER_LEN 6
50 #define ALCAP_PARM_HEADER_LEN 3
51 #define FIELD_NSAP_ADDRESS_LEN 20
53 static const value_string msg_type_strings[] = {
54 { 1, "Block confirm (BLC)" },
55 { 2, "Block request (BLO)" },
56 { 3, "Confusion (CFN)" },
57 { 4, "Establish confirm (ECF)" },
58 { 5, "Establish request (ERQ)" },
59 { 6, "Release confirm (RLC)" },
60 { 7, "Release request (REL)" },
61 { 8, "Reset confirm (RSC)" },
62 { 9, "Reset request (RES)" },
63 { 10, "Unblock confirm (UBC)" },
64 { 11, "Unblock request (UBL)" },
65 { 12, "Modify Ack (MOA)" },
66 { 13, "Modify Reject (MOR)" },
67 { 14, "Modify Request (MOD)" },
68 { 0, NULL }
70 static value_string_ext msg_type_strings_ext = VALUE_STRING_EXT_INIT(msg_type_strings);
72 static const value_string send_notification[] = {
73 { 0, "Do Not Send Notification"},
74 { 1, "Send Notification" },
75 { 0, NULL }
78 static const value_string instruction_indicator[] = {
79 { 0, "Pass On Message or Parameter"},
80 { 1, "Discard Parameter" },
81 { 2, "Discard Message" },
82 { 3, "Release Connection" },
83 { 0, NULL }
86 static const value_string msg_parm_strings[] = {
87 { 1, "Cause (CAU)" },
88 { 2, "Connection element identifier (CEID)" },
89 { 3, "Destination E.164 service endpoint address (DESEA)" },
90 { 4, "Destination NSAP service endpoint address (DNSEA)" },
91 { 5, "Link characteristics (ALC)" },
92 { 6, "Originating signalling association identifier (OSAID)" },
93 { 7, "Served user generated reference (SUGR)" },
94 { 8, "Served user transport (SUT)" },
95 { 9, "Service specific information (audio) (SSIA)" },
96 { 10, "Service specific information (multirate) (SSIM)" },
97 { 11, "Service specific information (SAR-assured) (SSISA)" },
98 { 12, "Service specific information (SAR-unassured) (SSISU)" },
99 { 13, "Test connection identifier (TCI)" },
100 { 14, "Modify Support for Link Characteristics (MSLC)" },
101 { 15, "Modify Support for Service Specific Information (MSSSI)" },
102 { 16, "Path Type (PT)" },
103 { 17, "Preferred Link Characteristics (PLC)" },
104 { 18, "Preferred Service Specific Information - Audio Extended (PSSIAE)" },
105 { 19, "Preferred Service Specific Information - Multirate Extended (PSSIME)" },
106 { 20, "Served User Correlation ID (SUCI)" },
107 { 21, "Origination NSAP Service Endpoint Address (ONSEA)" },
108 { 22, "Service Specific Information - Audio Extended (SSIAE)" },
109 { 23, "Service Specific Information - Multirate Extended (SSIME)" },
110 { 24, "Automatic Congestion Control (ACC)" },
111 { 25, "Connection Priority (CP)" },
112 { 26, "Hop Counter (HC)" },
113 { 27, "Origination E.164 Service Endpoint Address (OESEA)" },
114 { 28, "Preferred Transfer Capability - FBW (PFBW)" },
115 { 29, "Preferred Transfer Capability - VBWS (PVBWS)" },
116 { 30, "Preferred Transfer Capability - VBWT (PVBWT)" },
117 { 31, "TAR Controlled Connection (TCC)" },
118 { 32, "Transfer Capability (FBW)" },
119 { 33, "Transfer Capability (VBWS)" },
120 { 34, "Transfer Capability (VBWT)" },
121 { 35, "Transfer Capability Support (TCS)" },
122 { 0, NULL },
126 static const value_string enabled_disabled[] = {
127 {0, "disabled" },
128 {1, "enabled" },
129 {0,NULL}
132 static const value_string alaw_ulaw[] = {
133 {0, "A-Law" },
134 {1, "u-Law" },
135 {0,NULL}
138 static const value_string cause_coding_vals[] = {
139 {0, "ITU (Q.850 - Q.2610)"},
140 {1, "ISO/IEC"},
141 {2, "National"},
142 {3, "Private"},
143 {0,NULL}
147 static const value_string cause_values_itu[] = {
148 { 1, "Unallocated (unassigned) number"},
149 { 3, "No route to destination"},
150 { 31, "Normal, unspecified"},
151 { 34, "No circuit/channel available"},
152 { 38, "Network out of order"},
153 { 41, "Temporary failure"},
154 { 42, "Switching equipment congestion"},
155 { 44, "Requested circuit/channel not available"},
156 { 47, "Resource unavailable, unspecified"},
157 { 93, "AAL parameters cannot be supported"},
158 { 95, "Invalid message, unspecified"},
159 { 96, "Mandatory information element is missing"},
160 { 97, "Message type non-existent or not implemented"},
161 { 99, "Information element/parameter non-existent or not implemented"},
162 { 100, "Invalid information element contents"},
163 { 102, "Recovery on timer expiry"},
164 { 110, "Message with unrecognized parameter, discarded"},
165 { 111, "Protocol error, unspecified"},
166 { 0, NULL }
169 static const value_string audio_profile_type[] = {
170 { 0, "From I.366.2" },
171 { 1, "From Organization" },
172 { 2, "Custom" },
173 { 3, "Reserved" },
174 { 0, NULL }
177 static const value_string congestion_level[] = {
178 { 0, "Spare" },
179 { 1, "Congestion Level 1 exceeded" },
180 { 2, "Congestion Level 2 exceeded" },
181 { 0, NULL }
184 static const value_string connection_priority[] = {
185 { 0, "Level 1 (Highest)" },
186 { 1, "Level 2" },
187 { 2, "Level 3" },
188 { 3, "Level 4" },
189 { 4, "Level 5 (Lowest)" },
190 { 5, "Reserved" },
191 { 6, "Reserved" },
192 { 7, "Reserved" },
193 { 0, NULL }
198 static const char *alcap_proto_name = "AAL type 2 signalling protocol (Q.2630)";
199 static const char *alcap_proto_name_short = "ALCAP";
201 /* Initialize the subtree pointers */
202 static gint ett_alcap = -1;
203 static gint ett_leg = -1;
204 static gint ett_compat = -1;
205 static gint ett_cau_diag = -1;
207 /* Initialize the protocol and registered fields */
208 static int proto_alcap = -1;
210 static int hf_alcap_dsaid = -1;
211 static int hf_alcap_msg_id = -1;
212 static int hf_alcap_compat = -1;
213 static int hf_alcap_compat_pass_on_sni = -1;
214 static int hf_alcap_compat_pass_on_ii = -1;
215 static int hf_alcap_compat_general_sni = -1;
216 static int hf_alcap_compat_general_ii = -1;
218 static int hf_alcap_param_id = -1;
219 static int hf_alcap_param_len = -1;
221 static int hf_alcap_unknown = -1;
223 static int hf_alcap_cau_coding = -1;
224 static int hf_alcap_cau_value_itu = -1;
225 static int hf_alcap_cau_value_non_itu = -1;
226 static int hf_alcap_cau_diag = -1;
227 static int hf_alcap_cau_diag_len = -1;
228 static int hf_alcap_cau_diag_msg = -1;
229 static int hf_alcap_cau_diag_param_id = -1;
230 static int hf_alcap_cau_diag_field_num = -1;
232 static int hf_alcap_ceid_pathid = -1;
233 static int hf_alcap_ceid_cid = -1;
235 static int hf_alcap_dnsea = -1;
237 static int hf_alcap_alc_max_br_fw = -1;
238 static int hf_alcap_alc_max_br_bw = -1;
239 static int hf_alcap_alc_avg_br_fw = -1;
240 static int hf_alcap_alc_avg_br_bw = -1;
241 static int hf_alcap_alc_max_sdu_fw = -1;
242 static int hf_alcap_alc_max_sdu_bw = -1;
243 static int hf_alcap_alc_avg_sdu_fw = -1;
244 static int hf_alcap_alc_avg_sdu_bw = -1;
246 static int hf_alcap_osaid = -1;
248 static int hf_alcap_sugr = -1;
250 static int hf_alcap_sut_len = -1;
251 static int hf_alcap_sut = -1;
253 static int hf_alcap_ssia_pr_type = -1;
254 static int hf_alcap_ssia_pr_id = -1;
255 static int hf_alcap_ssia_frm = -1;
256 static int hf_alcap_ssia_cmd = -1;
257 static int hf_alcap_ssia_mfr2 = -1;
258 static int hf_alcap_ssia_mfr1 = -1;
259 static int hf_alcap_ssia_dtmf = -1;
260 static int hf_alcap_ssia_cas = -1;
261 static int hf_alcap_ssia_fax = -1;
262 static int hf_alcap_ssia_pcm = -1;
263 static int hf_alcap_ssia_max_len = -1;
264 static int hf_alcap_ssia_oui = -1;
266 static int hf_alcap_ssim_frm = -1;
267 static int hf_alcap_ssim_mult = -1;
268 static int hf_alcap_ssim_max = -1;
270 static int hf_alcap_ssisa_max_sssar_fw = -1;
271 static int hf_alcap_ssisa_max_sssar_bw = -1;
272 static int hf_alcap_ssisa_max_sscop_sdu_fw = -1;
273 static int hf_alcap_ssisa_max_sscop_sdu_bw = -1;
274 static int hf_alcap_ssisa_max_sscop_uu_fw = -1;
275 static int hf_alcap_ssisa_max_sscop_uu_bw = -1;
277 static int hf_alcap_ssisu_max_sssar_fw = -1;
278 static int hf_alcap_ssisu_max_sssar_bw = -1;
279 static int hf_alcap_ssisu_ted = -1;
281 static int hf_alcap_pt = -1;
283 static int hf_alcap_plc_max_br_fw = -1;
284 static int hf_alcap_plc_max_br_bw = -1;
285 static int hf_alcap_plc_avg_br_fw = -1;
286 static int hf_alcap_plc_avg_br_bw = -1;
287 static int hf_alcap_plc_max_sdu_fw = -1;
288 static int hf_alcap_plc_max_sdu_bw = -1;
289 static int hf_alcap_plc_avg_sdu_fw = -1;
290 static int hf_alcap_plc_avg_sdu_bw = -1;
292 static int hf_alcap_pssiae_pr_type = -1;
293 static int hf_alcap_pssiae_pr_id = -1;
294 static int hf_alcap_pssiae_lb = -1;
295 static int hf_alcap_pssiae_rc = -1;
296 static int hf_alcap_pssiae_syn = -1;
297 static int hf_alcap_pssiae_frm = -1;
298 static int hf_alcap_pssiae_cmd = -1;
299 static int hf_alcap_pssiae_mfr2 = -1;
300 static int hf_alcap_pssiae_mfr1 = -1;
301 static int hf_alcap_pssiae_dtmf = -1;
302 static int hf_alcap_pssiae_cas = -1;
303 static int hf_alcap_pssiae_fax = -1;
304 static int hf_alcap_pssiae_pcm = -1;
305 static int hf_alcap_pssiae_max_len = -1;
306 static int hf_alcap_pssiae_oui = -1;
308 static int hf_alcap_pssime_frm = -1;
309 static int hf_alcap_pssime_lb = -1;
310 static int hf_alcap_pssime_mult = -1;
311 static int hf_alcap_pssime_max = -1;
313 static int hf_alcap_suci = -1;
315 static int hf_alcap_onsea = -1;
317 static int hf_alcap_ssiae_pr_type = -1;
318 static int hf_alcap_ssiae_pr_id = -1;
319 static int hf_alcap_ssiae_lb = -1;
320 static int hf_alcap_ssiae_rc = -1;
321 static int hf_alcap_ssiae_syn = -1;
322 static int hf_alcap_ssiae_frm = -1;
323 static int hf_alcap_ssiae_cmd = -1;
324 static int hf_alcap_ssiae_mfr2 = -1;
325 static int hf_alcap_ssiae_mfr1 = -1;
326 static int hf_alcap_ssiae_dtmf = -1;
327 static int hf_alcap_ssiae_cas = -1;
328 static int hf_alcap_ssiae_fax = -1;
329 static int hf_alcap_ssiae_pcm = -1;
330 static int hf_alcap_ssiae_max_len = -1;
331 static int hf_alcap_ssiae_oui = -1;
333 static int hf_alcap_ssime_frm = -1;
334 static int hf_alcap_ssime_lb = -1;
335 static int hf_alcap_ssime_mult = -1;
336 static int hf_alcap_ssime_max = -1;
338 static int hf_alcap_acc_level = -1;
340 static int hf_alcap_cp = -1;
342 static int hf_alcap_hc = -1;
344 static int hf_alcap_pfbw_br_fw = -1;
345 static int hf_alcap_pfbw_br_bw = -1;
346 static int hf_alcap_pfbw_bucket_fw = -1;
347 static int hf_alcap_pfbw_bucket_bw = -1;
348 static int hf_alcap_pfbw_size_fw = -1;
349 static int hf_alcap_pfbw_size_bw = -1;
351 static int hf_alcap_pvbws_br_fw = -1;
352 static int hf_alcap_pvbws_br_bw = -1;
353 static int hf_alcap_pvbws_bucket_fw = -1;
354 static int hf_alcap_pvbws_bucket_bw = -1;
355 static int hf_alcap_pvbws_size_fw = -1;
356 static int hf_alcap_pvbws_size_bw = -1;
357 static int hf_alcap_pvbws_stt = -1;
359 static int hf_alcap_pvbwt_peak_br_fw = -1;
360 static int hf_alcap_pvbwt_peak_br_bw = -1;
361 static int hf_alcap_pvbwt_peak_bucket_fw = -1;
362 static int hf_alcap_pvbwt_peak_bucket_bw = -1;
363 static int hf_alcap_pvbwt_sust_br_fw = -1;
364 static int hf_alcap_pvbwt_sust_br_bw = -1;
365 static int hf_alcap_pvbwt_sust_bucket_fw = -1;
366 static int hf_alcap_pvbwt_sust_bucket_bw = -1;
367 static int hf_alcap_pvbwt_size_fw = -1;
368 static int hf_alcap_pvbwt_size_bw = -1;
370 static int hf_alcap_fbw_br_fw = -1;
371 static int hf_alcap_fbw_br_bw = -1;
372 static int hf_alcap_fbw_bucket_fw = -1;
373 static int hf_alcap_fbw_bucket_bw = -1;
374 static int hf_alcap_fbw_size_fw = -1;
375 static int hf_alcap_fbw_size_bw = -1;
377 static int hf_alcap_vbws_br_fw = -1;
378 static int hf_alcap_vbws_br_bw = -1;
379 static int hf_alcap_vbws_bucket_fw = -1;
380 static int hf_alcap_vbws_bucket_bw = -1;
381 static int hf_alcap_vbws_size_fw = -1;
382 static int hf_alcap_vbws_size_bw = -1;
383 static int hf_alcap_vbws_stt = -1;
385 static int hf_alcap_vbwt_peak_br_fw = -1;
386 static int hf_alcap_vbwt_peak_br_bw = -1;
387 static int hf_alcap_vbwt_peak_bucket_fw = -1;
388 static int hf_alcap_vbwt_peak_bucket_bw = -1;
389 static int hf_alcap_vbwt_sust_br_fw = -1;
390 static int hf_alcap_vbwt_sust_br_bw = -1;
391 static int hf_alcap_vbwt_sust_bucket_fw = -1;
392 static int hf_alcap_vbwt_sust_bucket_bw = -1;
393 static int hf_alcap_vbwt_size_fw = -1;
394 static int hf_alcap_vbwt_size_bw = -1;
397 static int hf_alcap_leg_osaid = -1;
398 static int hf_alcap_leg_dsaid = -1;
399 static int hf_alcap_leg_pathid = -1;
400 static int hf_alcap_leg_cid = -1;
401 static int hf_alcap_leg_sugr = -1;
402 static int hf_alcap_leg_dnsea = -1;
403 static int hf_alcap_leg_onsea = -1;
404 static int hf_alcap_leg_frame = -1;
405 static int hf_alcap_leg_release_cause = -1;
407 static expert_field ei_alcap_parameter_field_bad_length = EI_INIT;
408 static expert_field ei_alcap_undecoded = EI_INIT;
409 static expert_field ei_alcap_release_cause_not31 = EI_INIT;
410 static expert_field ei_alcap_abnormal_release = EI_INIT;
411 static expert_field ei_alcap_response = EI_INIT;
413 static gboolean keep_persistent_info = TRUE;
415 static wmem_tree_t* legs_by_dsaid = NULL;
416 static wmem_tree_t* legs_by_osaid = NULL;
417 static wmem_tree_t* legs_by_bearer = NULL;
419 static const gchar* dissect_fields_unknown(packet_info* pinfo, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
420 proto_item* pi = proto_tree_add_item(tree,hf_alcap_unknown,tvb,offset,len,ENC_NA);
421 expert_add_info(pinfo, pi, &ei_alcap_undecoded);
422 return NULL;
425 static const gchar* dissect_fields_cau(packet_info* pinfo, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info) {
427 * Q.2630.1 -> 7.3.1 Cause
429 * 7.4.16 Cause Value
430 * 7.4.17 Diagnostics
433 guint coding;
434 const gchar* ret_str;
435 proto_item* pi;
437 if (len < 2) {
438 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
439 return NULL;
442 msg_info->release_cause = tvb_get_guint8(tvb, offset+1) & 0x7f;
444 coding = tvb_get_guint8(tvb, offset) & 0x3;
446 proto_tree_add_item(tree, hf_alcap_cau_coding, tvb, offset, 1, ENC_BIG_ENDIAN);
448 if (coding == 0) {
449 pi = proto_tree_add_item(tree, hf_alcap_cau_value_itu, tvb, offset+1, 1, ENC_BIG_ENDIAN);
451 if ( msg_info->release_cause && msg_info->release_cause != 31 )
452 expert_add_info(pinfo, pi, &ei_alcap_abnormal_release);
454 ret_str = val_to_str(msg_info->release_cause, cause_values_itu, "Unknown(%u)");
455 } else {
456 proto_tree_add_item(tree, hf_alcap_cau_value_non_itu, tvb, offset+1 , 1, ENC_BIG_ENDIAN);
457 ret_str = wmem_strdup_printf(wmem_packet_scope(), "%u", msg_info->release_cause);
460 if (!tree) return ret_str;
462 offset += 2;
464 if (len > 2) {
465 int diag_len = tvb_get_guint8(tvb,offset);
467 pi = proto_tree_add_item(tree,hf_alcap_cau_diag, tvb, offset,len-2,ENC_NA);
468 tree = proto_item_add_subtree(pi,ett_cau_diag);
470 proto_tree_add_item(tree, hf_alcap_cau_diag_len, tvb, offset, 1, ENC_BIG_ENDIAN);
472 if (diag_len) {
473 switch (msg_info->release_cause) {
474 case 97:
475 case 99:
476 case 110:
477 proto_tree_add_item(tree, hf_alcap_cau_diag_msg, tvb, ++offset, 1, ENC_BIG_ENDIAN);
479 while(diag_len >= 2) {
480 proto_tree_add_item(tree, hf_alcap_cau_diag_param_id, tvb, ++offset, 1, ENC_BIG_ENDIAN);
481 proto_tree_add_item(tree, hf_alcap_cau_diag_field_num, tvb, ++offset, 1, ENC_BIG_ENDIAN);
482 diag_len -= 2;
484 break;
485 default:
486 /* XXX - TODO Q.2610 */
487 proto_tree_add_expert(tree, pinfo, &ei_alcap_undecoded, tvb, offset, diag_len);
488 break;
492 return ret_str;
495 static const gchar* dissect_fields_ceid(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info) {
497 * Q.2630.1 -> 7.3.2 Connection Element Identifier
499 * 7.4.3 Path Identifier
500 * 7.4.4 Channel Identifier
502 proto_item* pi;
504 if (len != 5) {
505 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
506 return NULL;
509 pi = proto_tree_add_item(tree,hf_alcap_ceid_pathid,tvb,offset,4,ENC_BIG_ENDIAN);
511 msg_info->pathid = tvb_get_ntohl(tvb,offset);
512 msg_info->cid = tvb_get_guint8(tvb,offset+4);
514 if (msg_info->pathid == 0) {
515 proto_item_append_text(pi," (All Paths in association)");
516 return "Path: 0 (All Paths)";
519 pi = proto_tree_add_item(tree,hf_alcap_ceid_cid,tvb,offset+4,1,ENC_BIG_ENDIAN);
521 if (msg_info->cid == 0) {
522 proto_item_append_text(pi," (All CIDs in the Path)");
523 return wmem_strdup_printf(wmem_packet_scope(), "Path: %u CID: 0 (Every CID)",msg_info->pathid);
524 } else {
525 return wmem_strdup_printf(wmem_packet_scope(), "Path: %u CID: %u",msg_info->pathid,msg_info->cid);
529 static const gchar* dissect_fields_desea(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
531 * Q.2630.1 -> 7.3.3 Destination E.164 service endpoint address
533 * 7.4.13 Nature of Address
534 * 7.4.14 E.164 Address
536 e164_info_t* e164;
538 if (len < 2) {
539 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
540 return NULL;
543 e164 = wmem_new(wmem_packet_scope(), e164_info_t);
545 e164->e164_number_type = CALLED_PARTY_NUMBER;
546 e164->nature_of_address = tvb_get_guint8(tvb,offset) & 0x7f;
547 e164->E164_number_str = (gchar*)tvb_get_string(wmem_packet_scope(),tvb,offset+1,len);
548 e164->E164_number_length = len-1;
550 dissect_e164_number(tvb, tree, offset-1, len, *e164);
552 return NULL;
555 static const gchar* dissect_fields_oesea(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
557 * Q.2630.3 -> 7.3.23 Origination E.164 service endpoint address
559 * 7.4.13 Nature of Address
560 * 7.4.14 E.164 Address
562 e164_info_t* e164;
564 if (len < 2) {
565 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
566 return NULL;
569 e164 = wmem_new(wmem_packet_scope(), e164_info_t);
571 e164->e164_number_type = CALLING_PARTY_NUMBER;
572 e164->nature_of_address = tvb_get_guint8(tvb,offset) & 0x7f;
573 e164->E164_number_str = (gchar*)tvb_get_string(wmem_packet_scope(),tvb,offset+1,len);
574 e164->E164_number_length = len-1;
576 dissect_e164_number(tvb, tree, offset-1, len, *e164);
578 return NULL;
581 static const gchar* dissect_fields_dnsea(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
583 * Q.2630.1 -> 7.3.4 Destination NSAP service endpoint address
585 * 7.4.15 NSAP Address
588 if (len < 1) {
589 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
590 return NULL;
593 msg_info->dest_nsap = tvb_bytes_to_str(tvb,offset,20);
595 proto_tree_add_item(tree, hf_alcap_dnsea, tvb, offset, 20, ENC_NA);
596 dissect_nsap(tvb, offset,20, tree);
598 return NULL;
601 static const gchar* dissect_fields_onsea(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
603 * Q.2630.3 -> 7.3.24 Origination NSAP service endpoint address
605 * 7.4.15 NSAP Address
608 if (len < 1) {
609 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
610 return NULL;
613 msg_info->orig_nsap = tvb_bytes_to_str(tvb,offset,20);
615 proto_tree_add_item(tree, hf_alcap_onsea, tvb, offset, 20, ENC_NA);
616 dissect_nsap(tvb, offset,20, tree);
618 return NULL;
621 static const gchar* dissect_fields_alc(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
623 * Q.2630.1 -> 7.3.5 Link characteristics
625 * 7.4.11 CPS-SDU Bit Rate -> Maximum CPS-SDU Bit Rate
626 * 7.4.11 CPS-SDU Bit Rate -> Average CPS-SDU Bit Rate
627 * 7.4.12 CPS-SDU Size -> Maximum CPS-SDU Size
628 * 7.4.12 CPS-SDU Size -> Average CPS-SDU Size
631 if (len != 12) {
632 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
633 return NULL;
636 proto_tree_add_item(tree, hf_alcap_alc_max_br_fw, tvb, offset+0, 2, ENC_BIG_ENDIAN);
637 proto_tree_add_item(tree, hf_alcap_alc_max_br_bw, tvb, offset+2, 2, ENC_BIG_ENDIAN);
638 proto_tree_add_item(tree, hf_alcap_alc_avg_br_fw, tvb, offset+4, 2, ENC_BIG_ENDIAN);
639 proto_tree_add_item(tree, hf_alcap_alc_avg_br_bw, tvb, offset+6, 2, ENC_BIG_ENDIAN);
640 proto_tree_add_item(tree, hf_alcap_alc_max_sdu_fw, tvb, offset+8, 1, ENC_BIG_ENDIAN);
641 proto_tree_add_item(tree, hf_alcap_alc_max_sdu_bw, tvb, offset+9, 1, ENC_BIG_ENDIAN);
642 proto_tree_add_item(tree, hf_alcap_alc_avg_sdu_fw, tvb, offset+10, 1, ENC_BIG_ENDIAN);
643 proto_tree_add_item(tree, hf_alcap_alc_avg_sdu_bw, tvb, offset+11, 1, ENC_BIG_ENDIAN);
645 return NULL;
648 static const gchar* dissect_fields_plc(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
650 * Q.2630.2 -> 7.3.19 Preferred Link characteristics
652 * 7.4.11 CPS-SDU Bit Rate -> Maximum CPS-SDU Bit Rate
653 * 7.4.11 CPS-SDU Bit Rate -> Average CPS-SDU Bit Rate
654 * 7.4.12 CPS-SDU Size -> Maximum CPS-SDU Size
655 * 7.4.12 CPS-SDU Size -> Average CPS-SDU Size
658 if (len != 12) {
659 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
660 return NULL;
663 proto_tree_add_item(tree, hf_alcap_plc_max_br_fw, tvb, offset+0, 2, ENC_BIG_ENDIAN);
664 proto_tree_add_item(tree, hf_alcap_plc_max_br_bw, tvb, offset+2, 2, ENC_BIG_ENDIAN);
665 proto_tree_add_item(tree, hf_alcap_plc_avg_br_fw, tvb, offset+4, 2, ENC_BIG_ENDIAN);
666 proto_tree_add_item(tree, hf_alcap_plc_avg_br_bw, tvb, offset+6, 2, ENC_BIG_ENDIAN);
667 proto_tree_add_item(tree, hf_alcap_plc_max_sdu_fw, tvb, offset+8, 1, ENC_BIG_ENDIAN);
668 proto_tree_add_item(tree, hf_alcap_plc_max_sdu_bw, tvb, offset+9, 1, ENC_BIG_ENDIAN);
669 proto_tree_add_item(tree, hf_alcap_plc_avg_sdu_fw, tvb, offset+10, 1, ENC_BIG_ENDIAN);
670 proto_tree_add_item(tree, hf_alcap_plc_avg_sdu_bw, tvb, offset+11, 1, ENC_BIG_ENDIAN);
672 return NULL;
675 static const gchar* dissect_fields_osaid(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
677 * Q.2630.1 -> 7.3.6 Originating signalling association identifier
679 * 7.4.2 Signalling Association Identifier -> Originating Signalling Association
681 if (len != 4) {
682 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
683 return NULL;
686 msg_info->osaid = tvb_get_ntohl(tvb,offset);
688 proto_tree_add_item(tree, hf_alcap_osaid, tvb, offset, 4, ENC_BIG_ENDIAN);
690 return NULL;
693 static const gchar* dissect_fields_sugr(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
695 * Q.2630.1 -> 7.3.7 Served user generated reference
697 * 7.4.10 Served User Generated Reference
699 if (len != 4) {
700 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
701 return NULL;
704 msg_info->sugr = tvb_get_ntohl(tvb,offset);
706 proto_tree_add_item(tree, hf_alcap_sugr, tvb, offset, 4, ENC_NA);
708 return NULL;
711 static const gchar* dissect_fields_suci(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
713 * Q.2630.2 -> 7.3.22 Served user correlation ID
715 * 7.4.22 Served user correlation ID
717 if (len != 4) {
718 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
719 return NULL;
722 proto_tree_add_item(tree, hf_alcap_suci, tvb, offset, len, ENC_BIG_ENDIAN);
724 return NULL;
727 static const gchar* dissect_fields_ssia(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
729 * Q.2630.2 -> 7.3.9 Service specific information (Audio)
731 * 7.4.5 Organizational Unique Identifier
733 if (len != 8) {
734 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
735 return NULL;
738 proto_tree_add_item(tree, hf_alcap_ssia_pr_type, tvb, offset+0,1,ENC_BIG_ENDIAN);
740 proto_tree_add_item(tree, hf_alcap_ssia_pr_id, tvb, offset+2,1,ENC_BIG_ENDIAN);
742 proto_tree_add_item(tree, hf_alcap_ssia_frm, tvb, offset+3,1,ENC_BIG_ENDIAN);
743 proto_tree_add_item(tree, hf_alcap_ssia_cmd, tvb, offset+3,1,ENC_BIG_ENDIAN);
744 proto_tree_add_item(tree, hf_alcap_ssia_mfr2, tvb, offset+3,1,ENC_BIG_ENDIAN);
745 proto_tree_add_item(tree, hf_alcap_ssia_mfr1, tvb, offset+3,1,ENC_BIG_ENDIAN);
746 proto_tree_add_item(tree, hf_alcap_ssia_dtmf, tvb, offset+3,1,ENC_BIG_ENDIAN);
747 proto_tree_add_item(tree, hf_alcap_ssia_cas, tvb, offset+3,1,ENC_BIG_ENDIAN);
748 proto_tree_add_item(tree, hf_alcap_ssia_fax, tvb, offset+3,1,ENC_BIG_ENDIAN);
749 proto_tree_add_item(tree, hf_alcap_ssia_pcm, tvb, offset+3,1,ENC_BIG_ENDIAN);
751 proto_tree_add_item(tree, hf_alcap_ssia_max_len, tvb, offset+4,2,ENC_BIG_ENDIAN);
753 proto_tree_add_item(tree, hf_alcap_ssia_oui, tvb, offset+5,3,ENC_NA);
755 return NULL;
758 static const gchar* dissect_fields_ssim(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
760 * Q.2630.1 -> 7.3.10 Service specific information (Multirate)
762 * 7.4.7 Multirate Service
764 if (len != 3) {
765 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
766 return NULL;
769 proto_tree_add_item(tree,hf_alcap_ssim_frm,tvb,offset,1,ENC_BIG_ENDIAN);
770 proto_tree_add_item(tree,hf_alcap_ssim_mult,tvb,offset,1,ENC_BIG_ENDIAN);
771 proto_tree_add_item(tree,hf_alcap_ssim_max,tvb,offset+1,2,ENC_BIG_ENDIAN);
773 return NULL;
776 static const gchar* dissect_fields_ssisa(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
778 * Q.2630.1 -> 7.3.11 Service specific information (SAR-assured)
780 * 7.4.8 Segmentation and Reassembly (Assured Data Transfer)
782 if (len != 14) {
783 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
784 return NULL;
787 proto_tree_add_item(tree,hf_alcap_ssisa_max_sssar_fw,tvb,offset,3,ENC_BIG_ENDIAN);
788 proto_tree_add_item(tree,hf_alcap_ssisa_max_sssar_bw,tvb,offset+3,3,ENC_BIG_ENDIAN);
789 proto_tree_add_item(tree,hf_alcap_ssisa_max_sscop_sdu_fw,tvb,offset+6,2,ENC_BIG_ENDIAN);
790 proto_tree_add_item(tree,hf_alcap_ssisa_max_sscop_sdu_bw,tvb,offset+8,2,ENC_BIG_ENDIAN);
791 proto_tree_add_item(tree,hf_alcap_ssisa_max_sscop_uu_fw,tvb,offset+10,2,ENC_BIG_ENDIAN);
792 proto_tree_add_item(tree,hf_alcap_ssisa_max_sscop_uu_bw,tvb,offset+12,2,ENC_BIG_ENDIAN);
794 proto_tree_add_text(tree,tvb,offset,14,"Not yet decoded: Q.2630.1 7.4.8");
796 return NULL;
799 static const gchar* dissect_fields_ssisu(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
801 * Q.2630.1 -> 7.3.12 Service specific information (SAR-unassured)
803 * 7.4.9 Segmentation and Reassembly (Unassured Data Transfer)
805 if (len != 7) {
806 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
807 return NULL;
810 proto_tree_add_item(tree,hf_alcap_ssisu_max_sssar_fw,tvb,offset,3,ENC_BIG_ENDIAN);
811 proto_tree_add_item(tree,hf_alcap_ssisu_max_sssar_bw,tvb,offset+3,3,ENC_BIG_ENDIAN);
812 proto_tree_add_item(tree,hf_alcap_ssisu_ted,tvb,offset+6,1,ENC_BIG_ENDIAN);
813 proto_tree_add_text(tree,tvb,offset,7,"Not yet decoded: Q.2630.1 7.4.9");
815 return NULL;
818 static const gchar* dissect_fields_none(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
820 * used for parameters that have no fields, just checks if len==0
822 * Q.2630.1 -> 7.3.13 Test connection indicator
823 * Q.2630.2 -> 7.3.20 Modify support for link characteristics
824 * Q.2630.2 -> 7.3.21 Modify support for service specific information
825 * Q.2630.3 -> 7.3.35 Transfer capability support
828 if (len != 0) {
829 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
830 return NULL;
833 return NULL;
836 static const gchar* dissect_fields_ssiae(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
838 * Q.2630.2 -> 7.3.15 Service specific information (Audio Extended)
840 * 7.4.19 Audio extended service
841 * 7.4.5 Organizational unique identifier
843 if (len != 8) {
844 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
845 return NULL;
848 proto_tree_add_item(tree, hf_alcap_ssiae_pr_type, tvb, offset,1,ENC_BIG_ENDIAN);
849 proto_tree_add_item(tree, hf_alcap_ssiae_lb, tvb, offset,1,ENC_BIG_ENDIAN);
850 proto_tree_add_item(tree, hf_alcap_ssiae_rc, tvb, offset,1,ENC_BIG_ENDIAN);
851 proto_tree_add_item(tree, hf_alcap_ssiae_syn, tvb, offset,1,ENC_BIG_ENDIAN);
853 proto_tree_add_item(tree, hf_alcap_ssiae_pr_id, tvb, offset+1,1,ENC_BIG_ENDIAN);
855 proto_tree_add_item(tree, hf_alcap_ssiae_frm, tvb, offset+3,1,ENC_BIG_ENDIAN);
856 proto_tree_add_item(tree, hf_alcap_ssiae_cmd, tvb, offset+3,1,ENC_BIG_ENDIAN);
857 proto_tree_add_item(tree, hf_alcap_ssiae_mfr2, tvb, offset+3,1,ENC_BIG_ENDIAN);
858 proto_tree_add_item(tree, hf_alcap_ssiae_mfr1, tvb, offset+3,1,ENC_BIG_ENDIAN);
859 proto_tree_add_item(tree, hf_alcap_ssiae_dtmf, tvb, offset+3,1,ENC_BIG_ENDIAN);
860 proto_tree_add_item(tree, hf_alcap_ssiae_cas, tvb, offset+3,1,ENC_BIG_ENDIAN);
861 proto_tree_add_item(tree, hf_alcap_ssiae_fax, tvb, offset+3,1,ENC_BIG_ENDIAN);
862 proto_tree_add_item(tree, hf_alcap_ssiae_pcm, tvb, offset+3,1,ENC_BIG_ENDIAN);
864 proto_tree_add_item(tree, hf_alcap_ssiae_max_len, tvb, offset+4,2,ENC_BIG_ENDIAN);
866 proto_tree_add_item(tree, hf_alcap_ssiae_oui, tvb, offset+5,3,ENC_NA);
868 return NULL;
871 static const gchar* dissect_fields_pssiae(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
873 * Q.2630.2 -> 7.3.17 Preferred service specific information (Audio Extended)
875 * 7.4.19 Audio extended service
876 * 7.4.5 Organizational unique identifier
878 if (len != 8) {
879 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
880 return NULL;
883 proto_tree_add_item(tree, hf_alcap_pssiae_pr_type, tvb, offset,1,ENC_BIG_ENDIAN);
884 proto_tree_add_item(tree, hf_alcap_pssiae_lb, tvb, offset,1,ENC_BIG_ENDIAN);
885 proto_tree_add_item(tree, hf_alcap_pssiae_rc, tvb, offset,1,ENC_BIG_ENDIAN);
886 proto_tree_add_item(tree, hf_alcap_pssiae_syn, tvb, offset,1,ENC_BIG_ENDIAN);
888 proto_tree_add_item(tree, hf_alcap_pssiae_pr_id, tvb, offset+1,1,ENC_BIG_ENDIAN);
890 proto_tree_add_item(tree, hf_alcap_pssiae_frm, tvb, offset+3,1,ENC_BIG_ENDIAN);
891 proto_tree_add_item(tree, hf_alcap_pssiae_cmd, tvb, offset+3,1,ENC_BIG_ENDIAN);
892 proto_tree_add_item(tree, hf_alcap_pssiae_mfr2, tvb, offset+3,1,ENC_BIG_ENDIAN);
893 proto_tree_add_item(tree, hf_alcap_pssiae_mfr1, tvb, offset+3,1,ENC_BIG_ENDIAN);
894 proto_tree_add_item(tree, hf_alcap_pssiae_dtmf, tvb, offset+3,1,ENC_BIG_ENDIAN);
895 proto_tree_add_item(tree, hf_alcap_pssiae_cas, tvb, offset+3,1,ENC_BIG_ENDIAN);
896 proto_tree_add_item(tree, hf_alcap_pssiae_fax, tvb, offset+3,1,ENC_BIG_ENDIAN);
897 proto_tree_add_item(tree, hf_alcap_pssiae_pcm, tvb, offset+3,1,ENC_BIG_ENDIAN);
899 proto_tree_add_item(tree, hf_alcap_pssiae_max_len, tvb, offset+4,2,ENC_BIG_ENDIAN);
901 proto_tree_add_item(tree, hf_alcap_pssiae_oui, tvb, offset+5,3,ENC_NA);
903 return NULL;
906 static const gchar* dissect_fields_ssime(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
908 * Q.2630.2 -> 7.3.16 Service specific information (Multirate Extended)
910 * 7.4.20 Multirate extended service
912 if (len != 3) {
913 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
914 return NULL;
917 proto_tree_add_item(tree,hf_alcap_ssime_frm,tvb,offset,1,ENC_BIG_ENDIAN);
918 proto_tree_add_item(tree,hf_alcap_ssime_lb,tvb,offset,1,ENC_BIG_ENDIAN);
919 proto_tree_add_item(tree,hf_alcap_ssime_mult,tvb,offset,1,ENC_BIG_ENDIAN);
920 proto_tree_add_item(tree,hf_alcap_ssime_max,tvb,offset+1,2,ENC_BIG_ENDIAN);
922 return NULL;
925 static const gchar* dissect_fields_pssime(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
927 * Q.2630.2 -> 7.3.18 Preferred service specific information (Multirate Extended)
929 * 7.4.20 Multirate extended service
931 if (len != 3) {
932 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
933 return NULL;
936 proto_tree_add_item(tree,hf_alcap_pssime_frm,tvb,offset,1,ENC_BIG_ENDIAN);
937 proto_tree_add_item(tree,hf_alcap_pssime_lb,tvb,offset,1,ENC_BIG_ENDIAN);
938 proto_tree_add_item(tree,hf_alcap_pssime_mult,tvb,offset,1,ENC_BIG_ENDIAN);
939 proto_tree_add_item(tree,hf_alcap_pssime_max,tvb,offset+1,2,ENC_BIG_ENDIAN);
941 return NULL;
944 static const gchar* dissect_fields_acc(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
946 * Q.2630.3 -> 7.3.25 Automatic congestion control
948 * 7.4.23 AAL type 2 Node Automatic Congestion Level
950 if (len != 1) {
951 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
952 return NULL;
955 proto_tree_add_item(tree,hf_alcap_acc_level,tvb,offset,len,ENC_BIG_ENDIAN);
956 return NULL;
960 static const gchar* dissect_fields_cp(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
962 * Q.2630.3 -> 7.3.26 Connection Priority
964 * 7.4.24 Priority
966 if (len != 1) {
967 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
968 return NULL;
971 proto_tree_add_item(tree,hf_alcap_cp,tvb,offset,len,ENC_BIG_ENDIAN);
972 return NULL;
975 static const gchar* dissect_fields_pt(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
977 * Q.2630.2 -> 7.3.14 Path Type
979 * 7.4.21 AAL Type 2 Path QoS Codepoint
981 if (len != 1) {
982 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
983 return NULL;
986 proto_tree_add_item(tree,hf_alcap_pt,tvb,offset,len,ENC_BIG_ENDIAN);
987 return NULL;
991 static const gchar* dissect_fields_hc(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
993 * Q.2630.3 -> 7.3.27 Hop counter
995 * 7.4.25 AAL type 2 Hop Counter
997 if (len != 1) {
998 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
999 return NULL;
1002 proto_tree_add_item(tree,hf_alcap_hc,tvb,offset,len,ENC_BIG_ENDIAN);
1003 return NULL;
1007 static const gchar* dissect_fields_fbw(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
1009 * Q.2630.3 -> 7.3.32 Fixed bandwidth transfer capability
1011 * 7.4.26 CPS Bit rate -> Peak CPS bit rate
1012 * 7.4.27 CPS Token Bucket Size -> CPS token bucket size associated with Peak CPS bit rate
1013 * 7.4.28 Maximum allowed CPS packet size
1015 if (len != 12) {
1016 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
1017 return NULL;
1020 proto_tree_add_item(tree,hf_alcap_fbw_br_fw,tvb,offset,3,ENC_BIG_ENDIAN);
1021 proto_tree_add_item(tree,hf_alcap_fbw_br_bw,tvb,offset+3,3,ENC_BIG_ENDIAN);
1022 proto_tree_add_item(tree,hf_alcap_fbw_bucket_fw,tvb,offset+6,2,ENC_BIG_ENDIAN);
1023 proto_tree_add_item(tree,hf_alcap_fbw_bucket_bw,tvb,offset+8,2,ENC_BIG_ENDIAN);
1024 proto_tree_add_item(tree,hf_alcap_fbw_size_fw,tvb,offset+10,1,ENC_BIG_ENDIAN);
1025 proto_tree_add_item(tree,hf_alcap_fbw_size_bw,tvb,offset+11,1,ENC_BIG_ENDIAN);
1027 return NULL;
1030 static const gchar* dissect_fields_pfbw(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
1032 * Q.2630.3 -> 7.3.29 Preferred fixed bandwidth transfer capability
1034 * 7.4.26 CPS Bit rate -> Peak CPS bit rate
1035 * 7.4.27 CPS Token Bucket Size -> CPS token bucket size associated with Peak CPS bit rate
1036 * 7.4.28 Maximum allowed CPS packet size
1038 if (len != 12) {
1039 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
1040 return NULL;
1043 proto_tree_add_item(tree,hf_alcap_pfbw_br_fw,tvb,offset,3,ENC_BIG_ENDIAN);
1044 proto_tree_add_item(tree,hf_alcap_pfbw_br_bw,tvb,offset+3,3,ENC_BIG_ENDIAN);
1045 proto_tree_add_item(tree,hf_alcap_pfbw_bucket_fw,tvb,offset+6,2,ENC_BIG_ENDIAN);
1046 proto_tree_add_item(tree,hf_alcap_pfbw_bucket_bw,tvb,offset+8,2,ENC_BIG_ENDIAN);
1047 proto_tree_add_item(tree,hf_alcap_pfbw_size_fw,tvb,offset+10,1,ENC_BIG_ENDIAN);
1048 proto_tree_add_item(tree,hf_alcap_pfbw_size_bw,tvb,offset+11,1,ENC_BIG_ENDIAN);
1050 return NULL;
1053 static const gchar* dissect_fields_vbws(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
1055 * Q.2630.3 -> 7.3.33 Variable bandwidth stringent transfer capability
1057 * 7.4.26 CPS Bit rate -> Peak CPS bit rate
1058 * 7.4.27 CPS Token Bucket Size -> CPS token bucket size associated with Peak CPS bit rate
1059 * 7.4.28 Maximum allowed CPS packet size
1060 * 7.4.29 Source Traffic Type
1062 if (len != 13) {
1063 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
1064 return NULL;
1067 proto_tree_add_item(tree,hf_alcap_vbws_br_fw,tvb,offset,3,ENC_BIG_ENDIAN);
1068 proto_tree_add_item(tree,hf_alcap_vbws_br_bw,tvb,offset+3,3,ENC_BIG_ENDIAN);
1069 proto_tree_add_item(tree,hf_alcap_vbws_bucket_fw,tvb,offset+6,2,ENC_BIG_ENDIAN);
1070 proto_tree_add_item(tree,hf_alcap_vbws_bucket_bw,tvb,offset+8,2,ENC_BIG_ENDIAN);
1071 proto_tree_add_item(tree,hf_alcap_vbws_size_fw,tvb,offset+10,1,ENC_BIG_ENDIAN);
1072 proto_tree_add_item(tree,hf_alcap_vbws_size_bw,tvb,offset+11,1,ENC_BIG_ENDIAN);
1073 proto_tree_add_item(tree,hf_alcap_vbws_size_bw,tvb,offset+11,1,ENC_BIG_ENDIAN);
1074 proto_tree_add_item(tree,hf_alcap_vbws_stt,tvb,offset+12,1,ENC_BIG_ENDIAN);
1076 return NULL;
1079 static const gchar* dissect_fields_pvbws(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
1081 * Q.2630.3 -> 7.3.30 Preferred variable bandwidth stringent transfer capability
1083 * 7.4.26 CPS Bit rate -> Peak CPS bit rate
1084 * 7.4.27 CPS Token Bucket Size -> CPS token bucket size associated with Peak CPS bit rate
1085 * 7.4.28 Maximum allowed CPS packet size
1086 * 7.4.29 Source Traffic Type
1088 if (len != 13) {
1089 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
1090 return NULL;
1093 proto_tree_add_item(tree,hf_alcap_pvbws_br_fw,tvb,offset,3,ENC_BIG_ENDIAN);
1094 proto_tree_add_item(tree,hf_alcap_pvbws_br_bw,tvb,offset+3,3,ENC_BIG_ENDIAN);
1095 proto_tree_add_item(tree,hf_alcap_pvbws_bucket_fw,tvb,offset+6,2,ENC_BIG_ENDIAN);
1096 proto_tree_add_item(tree,hf_alcap_pvbws_bucket_bw,tvb,offset+8,2,ENC_BIG_ENDIAN);
1097 proto_tree_add_item(tree,hf_alcap_pvbws_size_fw,tvb,offset+10,1,ENC_BIG_ENDIAN);
1098 proto_tree_add_item(tree,hf_alcap_pvbws_size_bw,tvb,offset+11,1,ENC_BIG_ENDIAN);
1099 proto_tree_add_item(tree,hf_alcap_pvbws_size_bw,tvb,offset+11,1,ENC_BIG_ENDIAN);
1100 proto_tree_add_item(tree,hf_alcap_pvbws_stt,tvb,offset+12,1,ENC_BIG_ENDIAN);
1102 return NULL;
1106 static const gchar* dissect_fields_pvbwt(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
1108 * Q.2630.3 -> 7.3.31 Preferred variable bandwidth tolerant transfer capability
1110 * 7.4.26 CPS Bit rate -> Peak CPS bit rate
1111 * 7.4.27 CPS Token Bucket Size -> CPS token bucket size associated with Peak CPS bit rate
1112 * 7.4.26 CPS Bit rate -> Sustainable CPS bit rate
1113 * 7.4.27 CPS Token Bucket Size -> CPS token bucket size associated with Sustainable CPS bit rate
1114 * 7.4.28 Maximum allowed CPS packet size
1117 if (len != 22) {
1118 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
1119 return NULL;
1122 proto_tree_add_item(tree,hf_alcap_pvbwt_peak_br_fw,tvb,offset,3,ENC_BIG_ENDIAN);
1123 proto_tree_add_item(tree,hf_alcap_pvbwt_peak_br_bw,tvb,offset+3,3,ENC_BIG_ENDIAN);
1125 proto_tree_add_item(tree,hf_alcap_pvbwt_peak_bucket_fw,tvb,offset+6,2,ENC_BIG_ENDIAN);
1126 proto_tree_add_item(tree,hf_alcap_pvbwt_peak_bucket_bw,tvb,offset+8,2,ENC_BIG_ENDIAN);
1128 proto_tree_add_item(tree,hf_alcap_pvbwt_sust_br_fw,tvb,offset+10,3,ENC_BIG_ENDIAN);
1129 proto_tree_add_item(tree,hf_alcap_pvbwt_sust_br_bw,tvb,offset+13,3,ENC_BIG_ENDIAN);
1131 proto_tree_add_item(tree,hf_alcap_pvbwt_sust_bucket_fw,tvb,offset+16,2,ENC_BIG_ENDIAN);
1132 proto_tree_add_item(tree,hf_alcap_pvbwt_sust_bucket_bw,tvb,offset+18,2,ENC_BIG_ENDIAN);
1134 proto_tree_add_item(tree,hf_alcap_pvbwt_size_fw,tvb,offset+20,1,ENC_BIG_ENDIAN);
1135 proto_tree_add_item(tree,hf_alcap_pvbwt_size_bw,tvb,offset+21,1,ENC_BIG_ENDIAN);
1137 return NULL;
1140 static const gchar* dissect_fields_vbwt(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
1142 * Q.2630.3 -> 7.3.34 Variable bandwidth tolerant transfer capability
1144 * 7.4.26 CPS Bit rate -> Peak CPS bit rate
1145 * 7.4.27 CPS Token Bucket Size -> CPS token bucket size associated with Peak CPS bit rate
1146 * 7.4.26 CPS Bit rate -> Sustainable CPS bit rate
1147 * 7.4.27 CPS Token Bucket Size -> CPS token bucket size associated with Sustainable CPS bit rate
1148 * 7.4.28 Maximum allowed CPS packet size
1150 if (len != 22) {
1151 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
1152 return NULL;
1155 proto_tree_add_item(tree,hf_alcap_vbwt_peak_br_fw,tvb,offset,3,ENC_BIG_ENDIAN);
1156 proto_tree_add_item(tree,hf_alcap_vbwt_peak_br_bw,tvb,offset+3,3,ENC_BIG_ENDIAN);
1158 proto_tree_add_item(tree,hf_alcap_vbwt_peak_bucket_fw,tvb,offset+6,2,ENC_BIG_ENDIAN);
1159 proto_tree_add_item(tree,hf_alcap_vbwt_peak_bucket_bw,tvb,offset+8,2,ENC_BIG_ENDIAN);
1161 proto_tree_add_item(tree,hf_alcap_vbwt_sust_br_fw,tvb,offset+10,3,ENC_BIG_ENDIAN);
1162 proto_tree_add_item(tree,hf_alcap_vbwt_sust_br_bw,tvb,offset+13,3,ENC_BIG_ENDIAN);
1164 proto_tree_add_item(tree,hf_alcap_vbwt_sust_bucket_fw,tvb,offset+16,2,ENC_BIG_ENDIAN);
1165 proto_tree_add_item(tree,hf_alcap_vbwt_sust_bucket_bw,tvb,offset+18,2,ENC_BIG_ENDIAN);
1167 proto_tree_add_item(tree,hf_alcap_vbwt_size_fw,tvb,offset+20,1,ENC_BIG_ENDIAN);
1168 proto_tree_add_item(tree,hf_alcap_vbwt_size_bw,tvb,offset+21,1,ENC_BIG_ENDIAN);
1170 return NULL;
1173 static const gchar* dissect_fields_sut(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
1175 * Q.2630.1 -> 7.3.8 Served user transport
1177 * 7.4.18 Served User Transport
1179 guint sut_len;
1181 if (len < 2) {
1182 proto_tree_add_expert(tree, pinfo, &ei_alcap_parameter_field_bad_length, tvb, offset, len);
1183 return NULL;
1186 sut_len = tvb_get_guint8(tvb,offset);
1188 proto_tree_add_item(tree, hf_alcap_sut_len, tvb, offset, 1, ENC_BIG_ENDIAN);
1189 proto_tree_add_item(tree, hf_alcap_sut, tvb, offset, sut_len, ENC_NA);
1191 return NULL;
1194 typedef const gchar* (*alcap_parameter_dissector_t) (packet_info* pinfo, tvbuff_t*, proto_tree*, int, int, alcap_message_info_t*);
1196 typedef struct _alcap_param_info_t {
1197 gint ett;
1198 const gchar* name;
1199 alcap_parameter_dissector_t dissect_fields;
1200 gboolean run_wo_tree;
1201 } alcap_param_info_t;
1203 static alcap_param_info_t param_infos[] = {
1204 {-1, "Unknown", dissect_fields_unknown, FALSE},
1205 {-1, "CAU", dissect_fields_cau, TRUE},
1206 {-1, "CEID", dissect_fields_ceid, TRUE},
1207 {-1, "DESEA", dissect_fields_desea, FALSE},
1208 {-1, "DNSEA", dissect_fields_dnsea, TRUE},
1209 {-1, "ALC", dissect_fields_alc, FALSE},
1210 {-1, "OSAID", dissect_fields_osaid, TRUE},
1211 {-1, "SUGR", dissect_fields_sugr, TRUE},
1212 {-1, "SUT", dissect_fields_sut, FALSE},
1213 {-1, "SSIA", dissect_fields_ssia, FALSE},
1214 {-1, "SSIM", dissect_fields_ssim, FALSE},
1215 {-1, "SSISA", dissect_fields_ssisa, FALSE},
1216 {-1, "SSISU", dissect_fields_ssisu, FALSE},
1217 {-1, "TCI", dissect_fields_none, FALSE},
1218 {-1, "MSLC", dissect_fields_none, FALSE},
1219 {-1, "MSSSI", dissect_fields_none, FALSE},
1220 {-1, "PT", dissect_fields_pt, FALSE},
1221 {-1, "PLC", dissect_fields_plc, FALSE},
1222 {-1, "PSSIAE", dissect_fields_pssiae, FALSE},
1223 {-1, "PSSIME", dissect_fields_pssime, FALSE},
1224 {-1, "SUCI", dissect_fields_suci, FALSE},
1225 {-1, "ONSEA", dissect_fields_onsea, TRUE},
1226 {-1, "SSIAE", dissect_fields_ssiae, FALSE},
1227 {-1, "SSIME", dissect_fields_ssime, FALSE},
1228 {-1, "ACC", dissect_fields_acc, FALSE},
1229 {-1, "CP", dissect_fields_cp, FALSE},
1230 {-1, "HC", dissect_fields_hc, FALSE},
1231 {-1, "OESEA", dissect_fields_oesea, FALSE},
1232 {-1, "PFBW", dissect_fields_pfbw, FALSE},
1233 {-1, "PVBWS", dissect_fields_pvbws, FALSE},
1234 {-1, "PVBWT", dissect_fields_pvbwt, FALSE},
1235 {-1, "TTC", dissect_fields_none, FALSE},
1236 {-1, "FBW", dissect_fields_fbw, FALSE},
1237 {-1, "VBWS", dissect_fields_vbws, FALSE},
1238 {-1, "VBWT", dissect_fields_vbwt, FALSE},
1239 {-1, "TCS", dissect_fields_none, FALSE}
1242 #define GET_PARAM_INFO(id) ( array_length(param_infos) <= id ? &(param_infos[0]) : &(param_infos[id]) )
1244 typedef struct _alcap_msg_type_info_t {
1245 const gchar* abbr;
1246 int severity; /* XXX - not used */
1247 } alcap_msg_type_info_t;
1249 static const alcap_msg_type_info_t msg_types[] = {
1250 { "Unknown Message ", PI_ERROR },
1251 { "BLC ", PI_NOTE },
1252 { "BLO ", PI_NOTE },
1253 { "CFN ", PI_WARN },
1254 { "ECF ", PI_CHAT },
1255 { "ERQ ", PI_CHAT },
1256 { "RLC ", PI_CHAT },
1257 { "REL ", PI_CHAT },
1258 { "RSC ", PI_NOTE },
1259 { "RES ", PI_NOTE },
1260 { "UBC ", PI_NOTE },
1261 { "UBL ", PI_NOTE },
1262 { "MOA ", PI_CHAT },
1263 { "MOR ", PI_CHAT },
1264 { "MOD ", PI_CHAT },
1267 static void alcap_leg_tree(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, const alcap_leg_info_t* leg) {
1268 proto_item* pi = proto_tree_add_text(tree,tvb,0,0,"[ALCAP Leg Info]");
1270 tree = proto_item_add_subtree(pi,ett_leg);
1272 if (leg->dsaid) {
1273 pi = proto_tree_add_uint(tree,hf_alcap_leg_dsaid,tvb,0,0,leg->dsaid);
1274 PROTO_ITEM_SET_GENERATED(pi);
1277 if (leg->osaid) {
1278 pi = proto_tree_add_uint(tree,hf_alcap_leg_osaid,tvb,0,0,leg->osaid);
1279 PROTO_ITEM_SET_GENERATED(pi);
1282 if (leg->pathid) {
1283 pi = proto_tree_add_uint(tree,hf_alcap_leg_pathid,tvb,0,0,leg->pathid);
1284 PROTO_ITEM_SET_GENERATED(pi);
1287 if (leg->cid) {
1288 pi = proto_tree_add_uint(tree,hf_alcap_leg_cid,tvb,0,0,leg->cid);
1289 PROTO_ITEM_SET_GENERATED(pi);
1292 if (leg->sugr) {
1293 pi = proto_tree_add_uint(tree,hf_alcap_leg_sugr,tvb,0,0,leg->sugr);
1294 PROTO_ITEM_SET_GENERATED(pi);
1297 if (leg->orig_nsap) {
1298 pi = proto_tree_add_string(tree,hf_alcap_leg_onsea,tvb,0,0,leg->orig_nsap);
1299 PROTO_ITEM_SET_GENERATED(pi);
1302 if (leg->dest_nsap) {
1303 pi = proto_tree_add_string(tree,hf_alcap_leg_dnsea,tvb,0,0,leg->dest_nsap);
1304 PROTO_ITEM_SET_GENERATED(pi);
1307 if(leg->release_cause) {
1308 pi = proto_tree_add_uint(tree,hf_alcap_leg_release_cause,tvb,0,0,leg->release_cause);
1309 PROTO_ITEM_SET_GENERATED(pi);
1310 if (leg->release_cause && leg->release_cause != 31)
1311 expert_add_info(pinfo, pi, &ei_alcap_release_cause_not31);
1314 if(leg->msgs) {
1315 alcap_msg_data_t* msg = leg->msgs;
1316 proto_item* pi_local = proto_tree_add_text(tree,tvb,0,0,"[Messages in this leg]");
1317 proto_tree* tree_local = proto_item_add_subtree(pi_local,ett_leg);
1320 do {
1321 pi_local = proto_tree_add_uint(tree_local,hf_alcap_leg_frame,tvb,0,0,msg->framenum);
1322 proto_item_set_text(pi_local,"%s in frame %u",
1323 val_to_str_ext_const(msg->msg_type,&msg_type_strings_ext,"Unknown message"),
1324 msg->framenum);
1325 PROTO_ITEM_SET_GENERATED(pi_local);
1326 } while (( msg = msg->next));
1333 extern void alcap_tree_from_bearer_key(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, const gchar* key) {
1334 alcap_leg_info_t* leg = (alcap_leg_info_t*)wmem_tree_lookup_string(legs_by_bearer,key,0);
1336 if (leg) {
1337 alcap_leg_tree(tree,tvb,pinfo,leg);
1341 #define GET_MSG_TYPE(id) ( array_length(msg_types) <= id ? &(msg_types[0]) : &(msg_types[id]) )
1343 static void dissect_alcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
1344 proto_tree *alcap_tree = NULL;
1345 alcap_message_info_t* msg_info = wmem_new0(wmem_packet_scope(), alcap_message_info_t);
1346 int len = tvb_length(tvb);
1347 int offset;
1348 proto_item* pi;
1349 proto_tree* compat_tree;
1350 const alcap_msg_type_info_t* msg_type;
1352 col_set_str(pinfo->cinfo, COL_PROTOCOL, alcap_proto_name_short);
1354 if (tree) {
1355 proto_item *alcap_item = proto_tree_add_item(tree, proto_alcap, tvb, 0, -1, ENC_NA);
1356 alcap_tree = proto_item_add_subtree(alcap_item, ett_alcap);
1359 proto_tree_add_item(alcap_tree,hf_alcap_dsaid,tvb,0,4,ENC_BIG_ENDIAN);
1360 pi = proto_tree_add_item(alcap_tree,hf_alcap_msg_id,tvb,4,1,ENC_BIG_ENDIAN);
1362 msg_info->dsaid = tvb_get_ntohl(tvb, 0);
1363 msg_info->msg_type = tvb_get_guint8(tvb, 4);
1365 msg_type = GET_MSG_TYPE(msg_info->msg_type);
1367 expert_add_info(pinfo, pi, &ei_alcap_response);
1369 col_set_str(pinfo->cinfo, COL_INFO, msg_type->abbr);
1371 pi = proto_tree_add_item(alcap_tree,hf_alcap_compat,tvb,5,1,ENC_NA);
1372 compat_tree = proto_item_add_subtree(pi,ett_compat);
1373 proto_tree_add_item(compat_tree,hf_alcap_compat_pass_on_sni,tvb,5,1,ENC_BIG_ENDIAN);
1374 proto_tree_add_item(compat_tree,hf_alcap_compat_pass_on_ii,tvb,5,1,ENC_BIG_ENDIAN);
1375 proto_tree_add_item(compat_tree,hf_alcap_compat_general_sni,tvb,5,1,ENC_BIG_ENDIAN);
1376 proto_tree_add_item(compat_tree,hf_alcap_compat_general_ii,tvb,5,1,ENC_BIG_ENDIAN);
1378 len -= ALCAP_MSG_HEADER_LEN;
1379 offset = ALCAP_MSG_HEADER_LEN;
1381 while(len > 0) {
1382 guint param_id = tvb_get_guint8(tvb,offset);
1383 guint param_len = tvb_get_guint8(tvb,offset+2);
1384 const alcap_param_info_t* param_info = GET_PARAM_INFO(param_id);
1385 proto_tree* param_tree;
1386 const gchar* colinfo_str = NULL;
1388 pi = proto_tree_add_item(alcap_tree,hf_alcap_param_id,tvb,offset,1,ENC_BIG_ENDIAN);
1389 param_tree = proto_item_add_subtree(pi,param_info->ett);
1391 pi = proto_tree_add_item(param_tree,hf_alcap_compat,tvb,offset+1,1,ENC_NA);
1392 compat_tree = proto_item_add_subtree(pi,ett_compat);
1393 proto_tree_add_item(compat_tree,hf_alcap_compat_pass_on_sni,tvb,offset+1,1,ENC_BIG_ENDIAN);
1394 proto_tree_add_item(compat_tree,hf_alcap_compat_pass_on_ii,tvb,offset+1,1,ENC_BIG_ENDIAN);
1395 proto_tree_add_item(compat_tree,hf_alcap_compat_general_sni,tvb,offset+1,1,ENC_BIG_ENDIAN);
1396 proto_tree_add_item(compat_tree,hf_alcap_compat_general_ii,tvb,offset+1,1,ENC_BIG_ENDIAN);
1398 proto_tree_add_item(param_tree,hf_alcap_param_len,tvb,offset+2,1,ENC_BIG_ENDIAN);
1400 if ( alcap_tree || param_info->run_wo_tree )
1401 colinfo_str = param_info->dissect_fields(pinfo,tvb,param_tree,offset+3,param_len,msg_info);
1403 col_append_fstr(pinfo->cinfo, COL_INFO, " %s",colinfo_str);
1405 len -= 3 + param_len;
1406 offset += 3 + param_len;
1409 if (keep_persistent_info) {
1410 alcap_leg_info_t* leg = NULL;
1411 switch (msg_info->msg_type) {
1412 case 5: /* ERQ */
1413 if( ! ( leg = (alcap_leg_info_t*)wmem_tree_lookup32(legs_by_osaid,msg_info->osaid) )) {
1414 leg = wmem_new(wmem_file_scope(), alcap_leg_info_t);
1416 leg->dsaid = 0;
1417 leg->osaid = msg_info->osaid;
1418 leg->pathid = msg_info->pathid;
1419 leg->cid = msg_info->cid;
1420 leg->sugr = msg_info->sugr;
1421 leg->orig_nsap = NULL;
1422 leg->dest_nsap = NULL;
1424 if (msg_info->orig_nsap) {
1425 gchar* key = wmem_strdup_printf(wmem_file_scope(), "%s:%.8X",msg_info->orig_nsap,leg->sugr);
1426 ascii_strdown_inplace(key);
1428 leg->orig_nsap = wmem_strdup(wmem_file_scope(), msg_info->orig_nsap);
1430 if (!wmem_tree_lookup_string(legs_by_bearer,key,0)) {
1431 wmem_tree_insert_string(legs_by_bearer,key,leg,0);
1435 if (msg_info->dest_nsap) {
1436 gchar* key = wmem_strdup_printf(wmem_file_scope(), "%s:%.8X",msg_info->dest_nsap,leg->sugr);
1437 ascii_strdown_inplace(key);
1439 leg->dest_nsap = wmem_strdup(wmem_file_scope(), msg_info->dest_nsap);
1441 if (!wmem_tree_lookup_string(legs_by_bearer,key,0)) {
1442 wmem_tree_insert_string(legs_by_bearer,key,leg,0);
1446 leg->msgs = NULL;
1447 leg->release_cause = 0;
1449 wmem_tree_insert32(legs_by_osaid,leg->osaid,leg);
1451 break;
1452 case 4: /* ECF */
1453 if(( leg = (alcap_leg_info_t *)wmem_tree_lookup32(legs_by_osaid,msg_info->dsaid) )) {
1454 leg->dsaid = msg_info->osaid;
1455 wmem_tree_insert32(legs_by_dsaid,leg->dsaid,leg);
1457 break;
1458 case 6: /* RLC */
1459 case 12: /* MOA */
1460 case 13: /* MOR */
1461 case 14: /* MOD */
1462 if( ( leg = (alcap_leg_info_t *)wmem_tree_lookup32(legs_by_osaid,msg_info->dsaid) )
1463 || ( leg = (alcap_leg_info_t *)wmem_tree_lookup32(legs_by_dsaid,msg_info->dsaid) ) ) {
1465 if(msg_info->release_cause)
1466 leg->release_cause = msg_info->release_cause;
1469 break;
1470 case 7: /* REL */
1471 leg = (alcap_leg_info_t *)wmem_tree_lookup32(legs_by_osaid,msg_info->dsaid);
1473 if(leg) {
1474 leg->release_cause = msg_info->release_cause;
1475 } else if (( leg = (alcap_leg_info_t *)wmem_tree_lookup32(legs_by_dsaid,msg_info->dsaid) )) {
1476 leg->release_cause = msg_info->release_cause;
1478 break;
1479 default:
1480 break;
1483 if (leg != NULL && ( (! leg->msgs) || leg->msgs->last->framenum < pinfo->fd->num ) ) {
1484 alcap_msg_data_t* msg = wmem_new(wmem_file_scope(), alcap_msg_data_t);
1485 msg->msg_type = msg_info->msg_type;
1486 msg->framenum = pinfo->fd->num;
1487 msg->next = NULL;
1488 msg->last = NULL;
1490 if (leg->msgs) {
1491 leg->msgs->last->next = msg;
1492 } else {
1493 leg->msgs = msg;
1496 leg->msgs->last = msg;
1500 if (tree && leg) alcap_leg_tree(alcap_tree,tvb,pinfo,leg);
1504 void
1505 proto_register_alcap(void)
1507 module_t *alcap_module;
1508 expert_module_t *expert_alcap;
1510 static hf_register_info hf[] = {
1511 { &hf_alcap_dsaid,
1512 { "DSAID", "alcap.dsaid",
1513 FT_UINT32, BASE_HEX, NULL, 0,
1514 "Destination Service Association ID", HFILL }
1516 { &hf_alcap_msg_id,
1517 { "Message Type", "alcap.msg_type",
1518 FT_UINT8, BASE_DEC | BASE_EXT_STRING, &msg_type_strings_ext, 0,
1519 NULL, HFILL }
1521 { &hf_alcap_compat,
1522 { "Message Compatibility", "alcap.compat",
1523 FT_BYTES, BASE_NONE, NULL, 0,
1524 NULL, HFILL }
1526 { &hf_alcap_compat_pass_on_sni,
1527 { "Pass-On SNI", "alcap.compat.pass.sni",
1528 FT_UINT8, BASE_DEC, VALS(send_notification), 0x40,
1529 "Send Notificaation Indicator", HFILL }
1531 { &hf_alcap_compat_pass_on_ii,
1532 { "Pass-On II", "alcap.compat.pass.ii",
1533 FT_UINT8, BASE_DEC, VALS(instruction_indicator), 0x30,
1534 "Instruction Indicator", HFILL }
1536 { &hf_alcap_compat_general_sni,
1537 { "General SNI", "alcap.compat.general.sni",
1538 FT_UINT8, BASE_DEC, VALS(send_notification), 0x04,
1539 "Send Notificaation Indicator", HFILL }
1541 { &hf_alcap_compat_general_ii,
1542 { "General II", "alcap.compat.general.ii",
1543 FT_UINT8, BASE_DEC, VALS(instruction_indicator), 0x03,
1544 "Instruction Indicator", HFILL }
1547 { &hf_alcap_unknown,
1548 { "Unknown Field Data", "alcap.unknown.field",
1549 FT_BYTES, BASE_NONE, NULL, 0,
1550 NULL, HFILL }
1553 { &hf_alcap_param_id,
1554 { "Parameter", "alcap.param",
1555 FT_UINT8, BASE_DEC, VALS(msg_parm_strings), 0,
1556 "Parameter Id", HFILL }
1558 { &hf_alcap_param_len,
1559 { "Length", "alcap.param.len",
1560 FT_UINT8, BASE_DEC, NULL, 0,
1561 "Parameter Length", HFILL }
1564 { &hf_alcap_cau_coding,
1565 { "Cause Coding", "alcap.cau.coding",
1566 FT_UINT8, BASE_DEC, VALS(cause_coding_vals), 0x03,
1567 NULL, HFILL }
1569 { &hf_alcap_cau_value_itu,
1570 { "Cause Value (ITU)", "alcap.cau.value",
1571 FT_UINT8, BASE_DEC, VALS(cause_values_itu), 0x7f,
1572 NULL, HFILL }
1574 { &hf_alcap_cau_value_non_itu,
1575 { "Cause Value (Other)", "alcap.cau.value",
1576 FT_UINT8, BASE_DEC, NULL, 0x7f,
1577 NULL, HFILL }
1579 { &hf_alcap_cau_diag,
1580 { "Diagnostic", "alcap.cau.diag",
1581 FT_BYTES, BASE_NONE, NULL, 0,
1582 NULL, HFILL }
1584 { &hf_alcap_cau_diag_len,
1585 { "Length", "alcap.cau.diag.len",
1586 FT_UINT8, BASE_DEC, NULL, 0,
1587 "Diagnostics Length", HFILL }
1589 { &hf_alcap_cau_diag_msg,
1590 { "Message Identifier", "alcap.cau.diag.msg",
1591 FT_UINT8, BASE_DEC | BASE_EXT_STRING, &msg_type_strings_ext, 0,
1592 NULL, HFILL }
1594 { &hf_alcap_cau_diag_param_id,
1595 { "Parameter Identifier", "alcap.cau.diag.param",
1596 FT_UINT8, BASE_DEC, NULL, 0,
1597 NULL, HFILL }
1599 { &hf_alcap_cau_diag_field_num,
1600 { "Field Number", "alcap.cau.diag.field_num",
1601 FT_UINT8, BASE_DEC, NULL, 0,
1602 NULL, HFILL }
1605 { &hf_alcap_ceid_pathid,
1606 { "Path ID", "alcap.ceid.pathid",
1607 FT_UINT32, BASE_DEC, NULL, 0,
1608 NULL, HFILL }
1610 { &hf_alcap_ceid_cid,
1611 { "CID", "alcap.ceid.cid",
1612 FT_UINT8, BASE_DEC, NULL, 0,
1613 NULL, HFILL }
1616 { &hf_alcap_dnsea,
1617 { "Address", "alcap.dnsea.addr",
1618 FT_BYTES, BASE_NONE, NULL, 0,
1619 NULL, HFILL }
1622 { &hf_alcap_alc_max_br_fw,
1623 { "Maximum Forward Bit Rate", "alcap.alc.bitrate.max.fw",
1624 FT_UINT16, BASE_DEC, NULL, 0,
1625 NULL, HFILL }
1627 { &hf_alcap_alc_max_br_bw,
1628 { "Maximum Backwards Bit Rate", "alcap.alc.bitrate.max.bw",
1629 FT_UINT16, BASE_DEC, NULL, 0,
1630 NULL, HFILL }
1632 { &hf_alcap_alc_avg_br_fw,
1633 { "Average Forward Bit Rate", "alcap.alc.bitrate.avg.fw",
1634 FT_UINT16, BASE_DEC, NULL, 0,
1635 NULL, HFILL }
1637 { &hf_alcap_alc_avg_br_bw,
1638 { "Average Backwards Bit Rate", "alcap.alc.bitrate.avg.bw",
1639 FT_UINT16, BASE_DEC, NULL, 0,
1640 NULL, HFILL }
1642 { &hf_alcap_alc_max_sdu_fw,
1643 { "Maximum Forward CPS SDU Size", "alcap.alc.sdusize.max.fw",
1644 FT_UINT8, BASE_DEC, NULL, 0x7f,
1645 NULL, HFILL }
1647 { &hf_alcap_alc_max_sdu_bw,
1648 { "Maximum Backwards CPS SDU Size", "alcap.alc.sdusize.max.bw",
1649 FT_UINT8, BASE_DEC, NULL, 0x7f,
1650 NULL, HFILL }
1652 { &hf_alcap_alc_avg_sdu_fw,
1653 { "Average Forward CPS SDU Size", "alcap.alc.sdusize.avg.fw",
1654 FT_UINT8, BASE_DEC, NULL, 0x7f,
1655 NULL, HFILL }
1657 { &hf_alcap_alc_avg_sdu_bw,
1658 { "Average Backwards CPS SDU Size", "alcap.alc.sdusize.avg.bw",
1659 FT_UINT8, BASE_DEC, NULL, 0x7f,
1660 NULL, HFILL }
1663 { &hf_alcap_osaid,
1664 { "OSAID", "alcap.osaid",
1665 FT_UINT32, BASE_HEX, NULL, 0,
1666 "Originating Service Association ID", HFILL }
1669 { &hf_alcap_sugr,
1670 { "SUGR", "alcap.sugr",
1671 FT_BYTES, BASE_NONE, NULL, 0,
1672 "Served User Generated Reference", HFILL }
1675 { &hf_alcap_sut_len,
1676 { "SUT Length", "alcap.sut.sut_len",
1677 FT_UINT8, BASE_HEX, NULL, 0,
1678 NULL, HFILL }
1680 { &hf_alcap_sut,
1681 { "SUT", "alcap.sut.transport",
1682 FT_BYTES, BASE_NONE, NULL, 0,
1683 "Served User Transport", HFILL }
1686 { &hf_alcap_ssia_pr_type,
1687 { "Profile Type", "alcap.ssia.profile.type",
1688 FT_UINT8, BASE_DEC, VALS(audio_profile_type), 0xc0,
1689 "I.366.2 Profile Type", HFILL }
1691 { &hf_alcap_ssia_pr_id,
1692 { "Profile Id", "alcap.ssia.profile.id",
1693 FT_UINT8, BASE_DEC, NULL, 0,
1694 NULL, HFILL }
1696 { &hf_alcap_ssia_frm,
1697 { "Frame Mode", "alcap.ssia.frm",
1698 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x80,
1699 NULL, HFILL }
1701 { &hf_alcap_ssia_cmd,
1702 { "Circuit Mode", "alcap.ssia.cmd",
1703 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x40,
1704 NULL, HFILL }
1706 { &hf_alcap_ssia_mfr2,
1707 { "Multi-Frequency R2", "alcap.ssia.mfr2",
1708 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x20,
1709 NULL, HFILL }
1711 { &hf_alcap_ssia_mfr1,
1712 { "Multi-Frequency R1", "alcap.ssia.mfr1",
1713 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x10,
1714 NULL, HFILL }
1716 { &hf_alcap_ssia_dtmf,
1717 { "DTMF", "alcap.ssia.dtmf",
1718 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x08,
1719 NULL, HFILL }
1721 { &hf_alcap_ssia_cas,
1722 { "CAS", "alcap.ssia.cas",
1723 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x04,
1724 "Channel Associated Signalling", HFILL }
1726 { &hf_alcap_ssia_fax,
1727 { "Fax", "alcap.ssia.fax",
1728 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x02,
1729 "Facsimile", HFILL }
1731 { &hf_alcap_ssia_pcm,
1732 { "PCM Mode", "alcap.ssia.pcm",
1733 FT_UINT8, BASE_DEC, VALS(alaw_ulaw), 0x01,
1734 NULL, HFILL }
1736 { &hf_alcap_ssia_max_len,
1737 { "Max Len of FM Data", "alcap.ssia.max_fmdata_len",
1738 FT_UINT16, BASE_DEC, NULL, 0,
1739 NULL, HFILL }
1741 { &hf_alcap_ssia_oui,
1742 { "OUI", "alcap.ssia.oui",
1743 FT_BYTES, BASE_NONE, NULL, 0,
1744 "Organizational Unique Identifier", HFILL }
1747 { &hf_alcap_ssim_frm,
1748 { "Frame Mode", "alcap.ssim.frm",
1749 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x80,
1750 NULL, HFILL }
1752 { &hf_alcap_ssim_mult,
1753 { "Multiplier", "alcap.ssim.mult",
1754 FT_UINT8, BASE_DEC, NULL, 0x1f,
1755 NULL, HFILL }
1757 { &hf_alcap_ssim_max,
1758 { "Max Len", "alcap.ssim.max",
1759 FT_UINT16, BASE_DEC, NULL, 0,
1760 NULL, HFILL }
1763 { &hf_alcap_ssisa_max_sssar_fw,
1764 { "Maximum Len of SSSAR-SDU Forward", "alcap.ssisa.sssar.max_len.fw",
1765 FT_UINT24, BASE_DEC, NULL, 0,
1766 NULL, HFILL }
1768 { &hf_alcap_ssisa_max_sssar_bw,
1769 { "Maximum Len of SSSAR-SDU Backwards", "alcap.ssisa.sssar.max_len.fw",
1770 FT_UINT24, BASE_DEC, NULL, 0,
1771 NULL, HFILL }
1773 { &hf_alcap_ssisa_max_sscop_sdu_fw,
1774 { "Maximum Len of SSSAR-SDU Forward", "alcap.ssisa.sscop.max_sdu_len.fw",
1775 FT_UINT16, BASE_DEC, NULL, 0,
1776 NULL, HFILL }
1778 { &hf_alcap_ssisa_max_sscop_sdu_bw,
1779 { "Maximum Len of SSSAR-SDU Backwards", "alcap.ssisa.sscop.max_sdu_len.bw",
1780 FT_UINT16, BASE_DEC, NULL, 0,
1781 NULL, HFILL }
1783 { &hf_alcap_ssisa_max_sscop_uu_fw,
1784 { "Maximum Len of SSSAR-SDU Forward", "alcap.ssisa.sscop.max_uu_len.fw",
1785 FT_UINT16, BASE_DEC, NULL, 0,
1786 NULL, HFILL }
1788 { &hf_alcap_ssisa_max_sscop_uu_bw,
1789 { "Maximum Len of SSSAR-SDU Backwards", "alcap.ssisa.sscop.max_uu_len.bw",
1790 FT_UINT16, BASE_DEC, NULL, 0,
1791 NULL, HFILL }
1794 { &hf_alcap_ssisu_max_sssar_fw,
1795 { "Maximum Len of SSSAR-SDU Forward", "alcap.ssisu.sssar.max_len.fw",
1796 FT_UINT24, BASE_DEC, NULL, 0,
1797 NULL, HFILL }
1799 { &hf_alcap_ssisu_max_sssar_bw,
1800 { "Maximum Len of SSSAR-SDU Backwards", "alcap.ssisu.sssar.max_len.fw",
1801 FT_UINT24, BASE_DEC, NULL, 0,
1802 NULL, HFILL }
1804 { &hf_alcap_ssisu_ted,
1805 { "Transmission Error Detection", "alcap.ssisu.ted",
1806 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x80,
1807 NULL, HFILL }
1810 { &hf_alcap_pt,
1811 { "QoS Codepoint", "alcap.pt.codepoint",
1812 FT_UINT8, BASE_DEC, NULL, 0x0,
1813 NULL, HFILL }
1816 { &hf_alcap_plc_max_br_fw,
1817 { "Maximum Forward Bit Rate", "alcap.plc.bitrate.max.fw",
1818 FT_UINT16, BASE_DEC, NULL, 0,
1819 NULL, HFILL }
1821 { &hf_alcap_plc_max_br_bw,
1822 { "Maximum Backwards Bit Rate", "alcap.plc.bitrate.max.bw",
1823 FT_UINT16, BASE_DEC, NULL, 0,
1824 NULL, HFILL }
1826 { &hf_alcap_plc_avg_br_fw,
1827 { "Average Forward Bit Rate", "alcap.plc.bitrate.avg.fw",
1828 FT_UINT16, BASE_DEC, NULL, 0,
1829 NULL, HFILL }
1831 { &hf_alcap_plc_avg_br_bw,
1832 { "Average Backwards Bit Rate", "alcap.plc.bitrate.avg.bw",
1833 FT_UINT16, BASE_DEC, NULL, 0,
1834 NULL, HFILL }
1836 { &hf_alcap_plc_max_sdu_fw,
1837 { "Maximum Forward CPS SDU Size", "alcap.plc.sdusize.max.fw",
1838 FT_UINT8, BASE_DEC, NULL, 0x7f,
1839 NULL, HFILL }
1841 { &hf_alcap_plc_max_sdu_bw,
1842 { "Maximum Backwards CPS SDU Size", "alcap.plc.sdusize.max.bw",
1843 FT_UINT8, BASE_DEC, NULL, 0x7f,
1844 NULL, HFILL }
1846 { &hf_alcap_plc_avg_sdu_fw,
1847 { "Maximum Forward CPS SDU Size", "alcap.plc.sdusize.max.fw",
1848 FT_UINT8, BASE_DEC, NULL, 0x7f,
1849 NULL, HFILL }
1851 { &hf_alcap_plc_avg_sdu_bw,
1852 { "Maximum Backwards CPS SDU Size", "alcap.plc.sdusize.max.bw",
1853 FT_UINT8, BASE_DEC, NULL, 0x7f,
1854 NULL, HFILL }
1857 { &hf_alcap_pssiae_pr_type,
1858 { "Profile Type", "alcap.pssiae.profile.type",
1859 FT_UINT8, BASE_DEC, VALS(audio_profile_type), 0xc0,
1860 "I.366.2 Profile Type", HFILL }
1862 { &hf_alcap_pssiae_pr_id,
1863 { "Profile Id", "alcap.pssiae.profile.id",
1864 FT_UINT8, BASE_DEC, NULL, 0,
1865 NULL, HFILL }
1867 { &hf_alcap_pssiae_lb,
1868 { "Loopback", "alcap.pssiae.lb",
1869 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0xc0,
1870 NULL, HFILL }
1872 { &hf_alcap_pssiae_rc,
1873 { "Rate Control", "alcap.pssiae.rc",
1874 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0xc0,
1875 NULL, HFILL }
1877 { &hf_alcap_pssiae_syn,
1878 { "Synchronization", "alcap.pssiae.syn",
1879 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0xc0,
1880 "Transport of synchronization of change in SSCS operation", HFILL }
1882 { &hf_alcap_pssiae_frm,
1883 { "Frame Mode", "alcap.pssiae.frm",
1884 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x80,
1885 NULL, HFILL }
1887 { &hf_alcap_pssiae_cmd,
1888 { "Circuit Mode", "alcap.pssiae.cmd",
1889 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x40,
1890 NULL, HFILL }
1892 { &hf_alcap_pssiae_mfr2,
1893 { "Multi-Frequency R2", "alcap.pssiae.mfr2",
1894 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x20,
1895 NULL, HFILL }
1897 { &hf_alcap_pssiae_mfr1,
1898 { "Multi-Frequency R1", "alcap.pssiae.mfr1",
1899 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x10,
1900 NULL, HFILL }
1902 { &hf_alcap_pssiae_dtmf,
1903 { "DTMF", "alcap.pssiae.dtmf",
1904 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x08,
1905 NULL, HFILL }
1907 { &hf_alcap_pssiae_cas,
1908 { "CAS", "alcap.pssiae.cas",
1909 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x04,
1910 "Channel Associated Signalling", HFILL }
1912 { &hf_alcap_pssiae_fax,
1913 { "Fax", "alcap.pssiae.fax",
1914 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x02,
1915 "Facsimile", HFILL }
1917 { &hf_alcap_pssiae_pcm,
1918 { "PCM Mode", "alcap.pssiae.pcm",
1919 FT_UINT8, BASE_DEC, VALS(alaw_ulaw), 0x01,
1920 NULL, HFILL }
1922 { &hf_alcap_pssiae_max_len,
1923 { "Max Len of FM Data", "alcap.pssiae.max_fmdata_len",
1924 FT_UINT16, BASE_DEC, NULL, 0,
1925 NULL, HFILL }
1927 { &hf_alcap_pssiae_oui,
1928 { "OUI", "alcap.pssiae.oui",
1929 FT_BYTES, BASE_NONE, NULL, 0,
1930 "Organizational Unique Identifier", HFILL }
1933 { &hf_alcap_pssime_frm,
1934 { "Frame Mode", "alcap.pssime.frm",
1935 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x80,
1936 NULL, HFILL }
1938 { &hf_alcap_pssime_lb,
1939 { "Loopback", "alcap.pssime.lb",
1940 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x40,
1941 NULL, HFILL }
1943 { &hf_alcap_pssime_mult,
1944 { "Multiplier", "alcap.pssime.mult",
1945 FT_UINT8, BASE_DEC, NULL, 0x1f,
1946 NULL, HFILL }
1948 { &hf_alcap_pssime_max,
1949 { "Max Len", "alcap.pssime.max",
1950 FT_UINT16, BASE_DEC, NULL, 0,
1951 NULL, HFILL }
1954 { &hf_alcap_suci,
1955 { "SUCI", "alcap.suci",
1956 FT_UINT8, BASE_HEX, NULL, 0,
1957 "Served User Correlation Id", HFILL }
1960 { &hf_alcap_onsea,
1961 { "Address", "alcap.onsea.addr",
1962 FT_BYTES, BASE_NONE, NULL, 0,
1963 NULL, HFILL }
1966 { &hf_alcap_ssiae_pr_type,
1967 { "Profile Type", "alcap.ssiae.profile.type",
1968 FT_UINT8, BASE_DEC, VALS(audio_profile_type), 0xc0,
1969 "I.366.2 Profile Type", HFILL }
1971 { &hf_alcap_ssiae_lb,
1972 { "Loopback", "alcap.ssiae.lb",
1973 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0xc0,
1974 NULL, HFILL }
1976 { &hf_alcap_ssiae_rc,
1977 { "Rate Control", "alcap.ssiae.rc",
1978 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0xc0,
1979 NULL, HFILL }
1981 { &hf_alcap_ssiae_syn,
1982 { "Synchronization", "alcap.ssiae.syn",
1983 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0xc0,
1984 "Transport of synchronization of change in SSCS operation", HFILL }
1986 { &hf_alcap_ssiae_pr_id,
1987 { "Profile Id", "alcap.ssiae.profile.id",
1988 FT_UINT8, BASE_DEC, NULL, 0,
1989 NULL, HFILL }
1991 { &hf_alcap_ssiae_frm,
1992 { "Frame Mode", "alcap.ssiae.frm",
1993 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x80,
1994 NULL, HFILL }
1996 { &hf_alcap_ssiae_cmd,
1997 { "Circuit Mode", "alcap.ssiae.cmd",
1998 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x40,
1999 NULL, HFILL }
2001 { &hf_alcap_ssiae_mfr2,
2002 { "Multi-Frequency R2", "alcap.ssiae.mfr2",
2003 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x20,
2004 NULL, HFILL }
2006 { &hf_alcap_ssiae_mfr1,
2007 { "Multi-Frequency R1", "alcap.ssiae.mfr1",
2008 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x10,
2009 NULL, HFILL }
2011 { &hf_alcap_ssiae_dtmf,
2012 { "DTMF", "alcap.ssiae.dtmf",
2013 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x08,
2014 NULL, HFILL }
2016 { &hf_alcap_ssiae_cas,
2017 { "CAS", "alcap.ssiae.cas",
2018 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x04,
2019 "Channel Associated Signalling", HFILL }
2021 { &hf_alcap_ssiae_fax,
2022 { "Fax", "alcap.ssiae.fax",
2023 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x02,
2024 "Facsimile", HFILL }
2026 { &hf_alcap_ssiae_pcm,
2027 { "PCM Mode", "alcap.ssiae.pcm",
2028 FT_UINT8, BASE_DEC, VALS(alaw_ulaw), 0x01,
2029 NULL, HFILL }
2031 { &hf_alcap_ssiae_max_len,
2032 { "Max Len of FM Data", "alcap.ssiae.max_fmdata_len",
2033 FT_UINT16, BASE_DEC, NULL, 0,
2034 NULL, HFILL }
2036 { &hf_alcap_ssiae_oui,
2037 { "OUI", "alcap.ssiae.oui",
2038 FT_BYTES, BASE_NONE, NULL, 0,
2039 "Organizational Unique Identifier", HFILL }
2042 { &hf_alcap_ssime_frm,
2043 { "Frame Mode", "alcap.ssime.frm",
2044 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x80,
2045 NULL, HFILL }
2047 { &hf_alcap_ssime_lb,
2048 { "Loopback", "alcap.ssime.lb",
2049 FT_UINT8, BASE_DEC, VALS(enabled_disabled), 0x40,
2050 NULL, HFILL }
2052 { &hf_alcap_ssime_mult,
2053 { "Multiplier", "alcap.ssime.mult",
2054 FT_UINT8, BASE_DEC, NULL, 0x1f,
2055 NULL, HFILL }
2057 { &hf_alcap_ssime_max,
2058 { "Max Len", "alcap.ssime.max",
2059 FT_UINT16, BASE_DEC, NULL, 0,
2060 NULL, HFILL }
2063 { &hf_alcap_acc_level,
2064 { "Congestion Level", "alcap.acc.level",
2065 FT_UINT8, BASE_DEC, VALS(congestion_level), 0,
2066 NULL, HFILL }
2069 { &hf_alcap_cp,
2070 { "Level", "alcap.cp.level",
2071 FT_UINT8, BASE_DEC, VALS(connection_priority), 0x07,
2072 NULL, HFILL }
2075 { &hf_alcap_hc,
2076 { "Codepoint", "alcap.hc.codepoint",
2077 FT_UINT8, BASE_DEC, NULL, 0,
2078 NULL, HFILL }
2081 { &hf_alcap_pfbw_br_fw,
2082 { "CPS Forward Bitrate", "alcap.pfbw.bitrate.fw",
2083 FT_UINT24, BASE_DEC, NULL, 0,
2084 NULL, HFILL }
2086 { &hf_alcap_pfbw_br_bw,
2087 { "CPS Backwards Bitrate", "alcap.pfbw.bitrate.bw",
2088 FT_UINT24, BASE_DEC, NULL, 0,
2089 NULL, HFILL }
2091 { &hf_alcap_pfbw_bucket_fw,
2092 { "Forward CPS Bucket Size", "alcap.pfbw.bucket_size.fw",
2093 FT_UINT16, BASE_DEC, NULL, 0,
2094 NULL, HFILL }
2096 { &hf_alcap_pfbw_bucket_bw,
2097 { "Backwards CPS Bucket Size", "alcap.pfbw.bucket_size.bw",
2098 FT_UINT16, BASE_DEC, NULL, 0,
2099 NULL, HFILL }
2101 { &hf_alcap_pfbw_size_fw,
2102 { "Forward CPS Packet Size", "alcap.pfbw.max_size.fw",
2103 FT_UINT8, BASE_DEC, NULL, 0,
2104 NULL, HFILL }
2106 { &hf_alcap_pfbw_size_bw,
2107 { "Backwards CPS Packet Size", "alcap.pfbw.max_size.bw",
2108 FT_UINT8, BASE_DEC, NULL, 0,
2109 NULL, HFILL }
2112 { &hf_alcap_pvbws_br_fw,
2113 { "Peak CPS Forward Bitrate", "alcap.pvbws.bitrate.fw",
2114 FT_UINT24, BASE_DEC, NULL, 0,
2115 NULL, HFILL }
2117 { &hf_alcap_pvbws_br_bw,
2118 { "Peak CPS Backwards Bitrate", "alcap.pvbws.bitrate.bw",
2119 FT_UINT24, BASE_DEC, NULL, 0,
2120 NULL, HFILL }
2122 { &hf_alcap_pvbws_bucket_fw,
2123 { "Peak Forward CPS Bucket Size", "alcap.pvbws.bucket_size.fw",
2124 FT_UINT16, BASE_DEC, NULL, 0,
2125 NULL, HFILL }
2127 { &hf_alcap_pvbws_bucket_bw,
2128 { "Peak Backwards CPS Bucket Size", "alcap.pvbws.bucket_size.bw",
2129 FT_UINT16, BASE_DEC, NULL, 0,
2130 NULL, HFILL }
2132 { &hf_alcap_pvbws_size_fw,
2133 { "Forward CPS Packet Size", "alcap.pvbws.max_size.fw",
2134 FT_UINT8, BASE_DEC, NULL, 0,
2135 NULL, HFILL }
2137 { &hf_alcap_pvbws_size_bw,
2138 { "Backwards CPS Packet Size", "alcap.pvbws.max_size.bw",
2139 FT_UINT8, BASE_DEC, NULL, 0,
2140 NULL, HFILL }
2142 { &hf_alcap_pvbws_stt,
2143 { "Source Traffic Type", "alcap.pvbws.stt",
2144 FT_UINT8, BASE_DEC, NULL, 0,
2145 NULL, HFILL }
2148 { &hf_alcap_pvbwt_peak_br_fw,
2149 { "Peak CPS Forward Bitrate", "alcap.pvbwt.bitrate.fw",
2150 FT_UINT24, BASE_DEC, NULL, 0,
2151 NULL, HFILL }
2153 { &hf_alcap_pvbwt_peak_br_bw,
2154 { "Peak CPS Backwards Bitrate", "alcap.pvbwt.bitrate.bw",
2155 FT_UINT24, BASE_DEC, NULL, 0,
2156 NULL, HFILL }
2158 { &hf_alcap_pvbwt_peak_bucket_fw,
2159 { "Peak Forward CPS Bucket Size", "alcap.pvbwt.bucket_size.fw",
2160 FT_UINT16, BASE_DEC, NULL, 0,
2161 NULL, HFILL }
2163 { &hf_alcap_pvbwt_peak_bucket_bw,
2164 { "Peak Backwards CPS Bucket Size", "alcap.pvbwt.bucket_size.bw",
2165 FT_UINT16, BASE_DEC, NULL, 0,
2166 NULL, HFILL }
2168 { &hf_alcap_pvbwt_sust_br_fw,
2169 { "Sustainable CPS Forward Bitrate", "alcap.pvbwt.bitrate.fw",
2170 FT_UINT24, BASE_DEC, NULL, 0,
2171 NULL, HFILL }
2173 { &hf_alcap_pvbwt_sust_br_bw,
2174 { "Sustainable CPS Backwards Bitrate", "alcap.pvbwt.bitrate.bw",
2175 FT_UINT24, BASE_DEC, NULL, 0,
2176 NULL, HFILL }
2178 { &hf_alcap_pvbwt_sust_bucket_fw,
2179 { "Sustainable Forward CPS Bucket Size", "alcap.pvbwt.bucket_size.fw",
2180 FT_UINT16, BASE_DEC, NULL, 0,
2181 NULL, HFILL }
2183 { &hf_alcap_pvbwt_sust_bucket_bw,
2184 { "Sustainable Backwards CPS Bucket Size", "alcap.pvbwt.bucket_size.bw",
2185 FT_UINT16, BASE_DEC, NULL, 0,
2186 NULL, HFILL }
2188 { &hf_alcap_pvbwt_size_fw,
2189 { "Forward CPS Packet Size", "alcap.pvbwt.max_size.fw",
2190 FT_UINT8, BASE_DEC, NULL, 0,
2191 NULL, HFILL }
2193 { &hf_alcap_pvbwt_size_bw,
2194 { "Backwards CPS Packet Size", "alcap.pvbwt.max_size.bw",
2195 FT_UINT8, BASE_DEC, NULL, 0,
2196 NULL, HFILL }
2199 { &hf_alcap_fbw_br_fw,
2200 { "CPS Forward Bitrate", "alcap.fbw.bitrate.fw",
2201 FT_UINT24, BASE_DEC, NULL, 0,
2202 NULL, HFILL }
2204 { &hf_alcap_fbw_br_bw,
2205 { "CPS Backwards Bitrate", "alcap.fbw.bitrate.bw",
2206 FT_UINT24, BASE_DEC, NULL, 0,
2207 NULL, HFILL }
2209 { &hf_alcap_fbw_bucket_fw,
2210 { "Forward CPS Bucket Size", "alcap.fbw.bucket_size.fw",
2211 FT_UINT16, BASE_DEC, NULL, 0,
2212 NULL, HFILL }
2214 { &hf_alcap_fbw_bucket_bw,
2215 { "Backwards CPS Bucket Size", "alcap.fbw.bucket_size.bw",
2216 FT_UINT16, BASE_DEC, NULL, 0,
2217 NULL, HFILL }
2219 { &hf_alcap_fbw_size_fw,
2220 { "Forward CPS Packet Size", "alcap.fbw.max_size.fw",
2221 FT_UINT8, BASE_DEC, NULL, 0,
2222 NULL, HFILL }
2224 { &hf_alcap_fbw_size_bw,
2225 { "Backwards CPS Packet Size", "alcap.fbw.max_size.bw",
2226 FT_UINT8, BASE_DEC, NULL, 0,
2227 NULL, HFILL }
2230 { &hf_alcap_vbws_br_fw,
2231 { "CPS Forward Bitrate", "alcap.vbws.bitrate.fw",
2232 FT_UINT24, BASE_DEC, NULL, 0,
2233 NULL, HFILL }
2235 { &hf_alcap_vbws_br_bw,
2236 { "CPS Backwards Bitrate", "alcap.vbws.bitrate.bw",
2237 FT_UINT24, BASE_DEC, NULL, 0,
2238 NULL, HFILL }
2240 { &hf_alcap_vbws_bucket_fw,
2241 { "Forward CPS Bucket Size", "alcap.vbws.bucket_size.fw",
2242 FT_UINT16, BASE_DEC, NULL, 0,
2243 NULL, HFILL }
2245 { &hf_alcap_vbws_bucket_bw,
2246 { "Backwards CPS Bucket Size", "alcap.vbws.bucket_size.bw",
2247 FT_UINT16, BASE_DEC, NULL, 0,
2248 NULL, HFILL }
2250 { &hf_alcap_vbws_size_fw,
2251 { "Forward CPS Packet Size", "alcap.vbws.max_size.fw",
2252 FT_UINT8, BASE_DEC, NULL, 0,
2253 NULL, HFILL }
2255 { &hf_alcap_vbws_size_bw,
2256 { "Backwards CPS Packet Size", "alcap.vbws.max_size.bw",
2257 FT_UINT8, BASE_DEC, NULL, 0,
2258 NULL, HFILL }
2260 { &hf_alcap_vbws_stt,
2261 { "Source Traffic Type", "alcap.vbws.stt",
2262 FT_UINT8, BASE_DEC, NULL, 0,
2263 NULL, HFILL }
2266 { &hf_alcap_vbwt_peak_br_fw,
2267 { "Peak CPS Forward Bitrate", "alcap.vbwt.bitrate.fw",
2268 FT_UINT24, BASE_DEC, NULL, 0,
2269 NULL, HFILL }
2271 { &hf_alcap_vbwt_peak_br_bw,
2272 { "Peak CPS Backwards Bitrate", "alcap.vbwt.bitrate.bw",
2273 FT_UINT24, BASE_DEC, NULL, 0,
2274 NULL, HFILL }
2276 { &hf_alcap_vbwt_peak_bucket_fw,
2277 { "Peak Forward CPS Bucket Size", "alcap.vbwt.bucket_size.fw",
2278 FT_UINT16, BASE_DEC, NULL, 0,
2279 NULL, HFILL }
2281 { &hf_alcap_vbwt_peak_bucket_bw,
2282 { "Peak Backwards CPS Bucket Size", "alcap.vbwt.bucket_size.bw",
2283 FT_UINT16, BASE_DEC, NULL, 0,
2284 NULL, HFILL }
2286 { &hf_alcap_vbwt_sust_br_fw,
2287 { "Sustainable CPS Forward Bitrate", "alcap.vbwt.bitrate.fw",
2288 FT_UINT24, BASE_DEC, NULL, 0,
2289 NULL, HFILL }
2291 { &hf_alcap_vbwt_sust_br_bw,
2292 { "Sustainable CPS Backwards Bitrate", "alcap.vbwt.bitrate.bw",
2293 FT_UINT24, BASE_DEC, NULL, 0,
2294 NULL, HFILL }
2296 { &hf_alcap_vbwt_sust_bucket_fw,
2297 { "Sustainable Forward CPS Bucket Size", "alcap.vbwt.bucket_size.fw",
2298 FT_UINT16, BASE_DEC, NULL, 0,
2299 NULL, HFILL }
2301 { &hf_alcap_vbwt_sust_bucket_bw,
2302 { "Sustainable Backwards CPS Bucket Size", "alcap.vbwt.bucket_size.bw",
2303 FT_UINT16, BASE_DEC, NULL, 0,
2304 NULL, HFILL }
2306 { &hf_alcap_vbwt_size_fw,
2307 { "Forward CPS Packet Size", "alcap.vbwt.max_size.fw",
2308 FT_UINT8, BASE_DEC, NULL, 0,
2309 NULL, HFILL }
2311 { &hf_alcap_vbwt_size_bw,
2312 { "Backwards CPS Packet Size", "alcap.vbwt.max_size.bw",
2313 FT_UINT8, BASE_DEC, NULL, 0,
2314 NULL, HFILL }
2317 { &hf_alcap_leg_osaid,
2318 { "Leg's ERQ OSA id", "alcap.leg.osaid",
2319 FT_UINT32, BASE_HEX, NULL, 0,
2320 NULL, HFILL }
2322 { &hf_alcap_leg_dsaid,
2323 { "Leg's ECF OSA id", "alcap.leg.dsaid",
2324 FT_UINT32, BASE_HEX, NULL, 0,
2325 NULL, HFILL }
2327 { &hf_alcap_leg_pathid,
2328 { "Leg's path id", "alcap.leg.pathid",
2329 FT_UINT32, BASE_DEC, NULL, 0,
2330 NULL, HFILL }
2332 { &hf_alcap_leg_cid,
2333 { "Leg's channel id", "alcap.leg.cid",
2334 FT_UINT32, BASE_DEC, NULL, 0,
2335 NULL, HFILL }
2337 { &hf_alcap_leg_sugr,
2338 { "Leg's SUGR", "alcap.leg.sugr",
2339 FT_UINT32, BASE_HEX, NULL, 0,
2340 NULL, HFILL }
2342 { &hf_alcap_leg_dnsea,
2343 { "Leg's destination NSAP", "alcap.leg.dnsea",
2344 FT_STRING, BASE_NONE, NULL, 0,
2345 NULL, HFILL }
2347 { &hf_alcap_leg_onsea,
2348 { "Leg's originating NSAP", "alcap.leg.onsea",
2349 FT_STRING, BASE_NONE, NULL, 0,
2350 NULL, HFILL }
2352 { &hf_alcap_leg_frame,
2353 { "a message of this leg", "alcap.leg.msg",
2354 FT_FRAMENUM, BASE_NONE, NULL, 0,
2355 NULL, HFILL }
2357 { &hf_alcap_leg_release_cause,
2358 { "Leg's cause value in REL", "alcap.leg.cause",
2359 FT_UINT8, BASE_DEC, VALS(cause_values_itu), 0,
2360 NULL, HFILL }
2365 gint* ett[] = {
2366 &ett_alcap,
2367 &ett_leg,
2368 &ett_compat,
2369 &ett_cau_diag,
2370 &param_infos[0].ett,
2371 &param_infos[1].ett,
2372 &param_infos[2].ett,
2373 &param_infos[3].ett,
2374 &param_infos[4].ett,
2375 &param_infos[5].ett,
2376 &param_infos[6].ett,
2377 &param_infos[7].ett,
2378 &param_infos[8].ett,
2379 &param_infos[9].ett,
2380 &param_infos[10].ett,
2381 &param_infos[11].ett,
2382 &param_infos[12].ett,
2383 &param_infos[13].ett,
2384 &param_infos[14].ett,
2385 &param_infos[15].ett,
2386 &param_infos[16].ett,
2387 &param_infos[17].ett,
2388 &param_infos[18].ett,
2389 &param_infos[19].ett,
2390 &param_infos[20].ett,
2391 &param_infos[21].ett,
2392 &param_infos[22].ett,
2393 &param_infos[23].ett,
2394 &param_infos[24].ett,
2395 &param_infos[25].ett,
2396 &param_infos[26].ett,
2397 &param_infos[27].ett,
2398 &param_infos[28].ett,
2399 &param_infos[29].ett,
2400 &param_infos[30].ett,
2401 &param_infos[31].ett,
2402 &param_infos[32].ett,
2403 &param_infos[33].ett,
2404 &param_infos[34].ett,
2405 &param_infos[35].ett,
2408 static ei_register_info ei[] = {
2409 { &ei_alcap_parameter_field_bad_length, { "alcap.parameter_field_bad_length", PI_MALFORMED, PI_WARN, "Wrong length for parameter fields", EXPFILL }},
2410 { &ei_alcap_undecoded, { "alcap.undecoded", PI_UNDECODED, PI_WARN, "Undecoded", EXPFILL }},
2411 { &ei_alcap_release_cause_not31, { "alcap.leg.cause.not31", PI_RESPONSE_CODE, PI_WARN, "Leg Release cause != 31", EXPFILL }},
2412 { &ei_alcap_abnormal_release, { "alcap.abnormal_release", PI_RESPONSE_CODE, PI_WARN, "Abnormal Release", EXPFILL }},
2413 { &ei_alcap_response, { "alcap.response", PI_RESPONSE_CODE, PI_NOTE, " ", EXPFILL }},
2416 proto_alcap = proto_register_protocol(alcap_proto_name, alcap_proto_name_short, "alcap");
2418 register_dissector("alcap", dissect_alcap, proto_alcap);
2420 proto_register_field_array(proto_alcap, hf, array_length(hf));
2421 proto_register_subtree_array(ett, array_length(ett));
2422 expert_alcap = expert_register_protocol(proto_alcap);
2423 expert_register_field_array(expert_alcap, ei, array_length(ei));
2425 alcap_module = prefs_register_protocol(proto_alcap, NULL);
2427 prefs_register_bool_preference(alcap_module, "leg_info",
2428 "Keep Leg Information",
2429 "Whether persistent call leg information is to be kept",
2430 &keep_persistent_info);
2432 legs_by_dsaid = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
2433 legs_by_osaid = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
2434 legs_by_bearer = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
2438 void
2439 proto_reg_handoff_alcap(void)
2441 dissector_handle_t alcap_handle = find_dissector("alcap");
2443 dissector_add_uint("mtp3.service_indicator", MTP_SI_AAL2, alcap_handle);