2 * Routines for Message Transfer Part Level 3 Management and Test dissection
4 * It is (hopefully) compliant to:
7 * ITU-T Q.707 7/1996 and ANSI T1.111.7-1996 (for SLT message formats)
8 * portions of ITU-T Q.2210 7/1996 (for XCO/XCA message formats)
9 * GF 001-9001 (Chinese ITU variant)
11 * Copyright 2003, Jeff Morriss <jeff.morriss[AT]ulticom.com>
13 * $Id: packet-mtp3mg.c,v 1.8 2003/09/04 14:30:18 tuexen Exp $
15 * Ethereal - Network traffic analyzer
16 * By Gerald Combs <gerald@ethereal.com>
17 * Copyright 1998 Gerald Combs
19 * Copied from packet-mtp3.c
21 * This program is free software; you can redistribute it and/or
22 * modify it under the terms of the GNU General Public License
23 * as published by the Free Software Foundation; either version 2
24 * of the License, or (at your option) any later version.
26 * This program is distributed in the hope that it will be useful,
27 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 * GNU General Public License for more details.
31 * You should have received a copy of the GNU General Public License
32 * along with this program; if not, write to the Free Software
33 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
42 #ifdef NEED_SNPRINTF_H
46 #include <epan/packet.h>
49 #include <packet-mtp3.h>
50 extern Standard_Type mtp3_standard;
52 /* MTP3 Service Indicators used by this dissector */
54 #define MTP3MG_ITU_TEST_SI 1
55 #define MTP3MG_ANSI_TEST_SI 2
71 static const value_string h0_message_type_values[] = {
72 { H0_CHM, "Changeover and changeback messages" },
73 { H0_ECM, "Emergency changeover messages" },
74 { H0_FCM, "Transfer-controlled and signalling route set congestion messages" },
75 { H0_TFM, "Transfer prohibited-allowed-restricted messages" },
76 { H0_RSM, "Signalling-route-set-test messages" },
77 { H0_MIM, "Management inhibit messages" },
78 { H0_TRM, "Traffic restart messages" },
79 { H0_DLM, "Signalling-data-link-connection messages" },
80 { H0_UFC, "User part flow control messages" },
83 #define TEST_H0_SLT 0x1
84 static const value_string test_h0_message_type_values[] = {
85 { TEST_H0_SLT, "Test messages" },
88 #define CHM_H1_COO 0x01
89 #define CHM_H1_COA 0x02
90 #define CHM_H1_XCO 0x03
91 #define CHM_H1_XCA 0x04
92 #define CHM_H1_CBD 0x05
93 #define CHM_H1_CBA 0x06
94 static const value_string chm_h1_message_type_values[] = {
95 { CHM_H1_COO, "Changeover-order signal" },
96 { CHM_H1_COA, "Changeover-ack signal" },
97 { CHM_H1_XCO, "Extended changeover-order signal" },
98 { CHM_H1_XCA, "Extended changeover-ack signal" },
99 { CHM_H1_CBD, "Changeback-declaration signal" },
100 { CHM_H1_CBA, "Changeback-ack signal" },
103 /* Same as above but in acronym form (for the Info column) */
104 static const value_string chm_h1_message_type_acro_values[] = {
105 { CHM_H1_COO, "COO" },
106 { CHM_H1_COA, "COA" },
107 { CHM_H1_XCO, "XCO" },
108 { CHM_H1_XCA, "XCA" },
109 { CHM_H1_CBD, "CBD" },
110 { CHM_H1_CBA, "CBA" },
113 #define ECM_H1_ECO 0x01
114 #define ECM_H1_ECA 0x02
115 static const value_string ecm_h1_message_type_values[] = {
116 { ECM_H1_ECO, "Emergency-changeover-order signal" },
117 { ECM_H1_ECA, "Emergency-changeover-ack signal" },
120 /* Same as above but in acronym form (for the Info column) */
121 static const value_string ecm_h1_message_type_acro_values[] = {
122 { ECM_H1_ECO, "ECO" },
123 { ECM_H1_ECA, "ECA" },
126 #define FCM_H1_RCT 0x01
127 #define FCM_H1_TFC 0x02
128 static const value_string fcm_h1_message_type_values[] = {
129 { FCM_H1_RCT, "Signalling-route-set-congestion-test signal" },
130 { FCM_H1_TFC, "Transfer-controlled signal" },
133 /* Same as above but in acronym form (for the Info column) */
134 static const value_string fcm_h1_message_type_acro_values[] = {
135 { FCM_H1_RCT, "RCT" },
136 { FCM_H1_TFC, "TFC" },
139 #define TFM_H1_TFP 0x01
140 #define TFM_H1_TCP 0x02 /* ANSI only */
141 #define TFM_H1_TFR 0x03
142 #define TFM_H1_TCR 0x04 /* ANSI only */
143 #define TFM_H1_TFA 0x05
144 #define TFM_H1_TCA 0x06 /* ANSI only */
145 static const value_string tfm_h1_message_type_values[] = {
146 { TFM_H1_TFP, "Transfer-prohibited signal" },
147 { TFM_H1_TCP, "Transfer-cluster-prohibited signal (ANSI only)" },
148 { TFM_H1_TFR, "Transfer-restricted signal" },
149 { TFM_H1_TCR, "Transfer-cluster-restricted signal (ANSI only)" },
150 { TFM_H1_TFA, "Transfer-allowed signal" },
151 { TFM_H1_TCA, "Transfer-cluster-allowed signal (ANSI only)" },
154 /* Same as above but in acronym form (for the Info column) */
155 static const value_string tfm_h1_message_type_acro_values[] = {
156 { TFM_H1_TFP, "TFP" },
157 { TFM_H1_TCP, "TCP" },
158 { TFM_H1_TFR, "TFR" },
159 { TFM_H1_TCR, "TCR" },
160 { TFM_H1_TFA, "TFA" },
161 { TFM_H1_TCA, "TCA" },
164 #define RSM_H1_RST 0x01
165 #define RSM_H1_RSR 0x02
166 #define RSM_H1_RCP 0x03 /* ANSI only */
167 #define RSM_H1_RCR 0x04 /* ANSI only */
168 static const value_string rsm_h1_message_type_values[] = {
169 { RSM_H1_RST, "Signalling-route-set-test prohibited signal" },
170 { RSM_H1_RSR, "Signalling-route-set-test restricted signal" },
171 { RSM_H1_RCP, "Signalling-route-set-test cluster-prohibited signal (ANSI only)" },
172 { RSM_H1_RCR, "Signalling-route-set-test cluster-restricted signal (ANSI only)" },
175 /* Same as above but in acronym form (for the Info column) */
176 static const value_string rsm_h1_message_type_acro_values[] = {
177 { RSM_H1_RST, "RST" },
178 { RSM_H1_RSR, "RSR" },
179 { RSM_H1_RCP, "RCP" },
180 { RSM_H1_RCR, "RCR" },
183 #define MIM_H1_LIN 0x01
184 #define MIM_H1_LUN 0x02
185 #define MIM_H1_LIA 0x03
186 #define MIM_H1_LUA 0x04
187 #define MIM_H1_LID 0x05
188 #define MIM_H1_LFU 0x06
189 #define MIM_H1_LLT 0x07 /* LLI in ANSI */
190 #define MIM_H1_LRT 0x08 /* LRI in ANSI */
191 static const value_string mim_h1_message_type_values[] = {
192 { MIM_H1_LIN, "Link inhibit signal" },
193 { MIM_H1_LUN, "Link uninhibit signal" },
194 { MIM_H1_LIA, "Link inhibit ack signal" },
195 { MIM_H1_LUA, "Link uninhibit ack signal" },
196 { MIM_H1_LID, "Link inhibit denied signal" },
197 { MIM_H1_LFU, "Link forced uninhibit signal" },
198 { MIM_H1_LLT, "Link local inhibit test signal" },
199 { MIM_H1_LRT, "Link remote inhibit test signal" },
202 /* Same as above but in acronym form (for the Info column) */
203 static const value_string mim_h1_message_type_acro_values[] = {
204 { MIM_H1_LIN, "LIN" },
205 { MIM_H1_LUN, "LUN" },
206 { MIM_H1_LIA, "LIA" },
207 { MIM_H1_LUA, "LUA" },
208 { MIM_H1_LID, "LID" },
209 { MIM_H1_LFU, "LFU" },
210 { MIM_H1_LLT, "LLT (LLI)" },
211 { MIM_H1_LRT, "LRT (LRI)" },
214 #define TRM_H1_TRA 0x01
215 #define TRM_H1_TRW 0x02 /* ANSI only */
216 static const value_string trm_h1_message_type_values[] = {
217 { TRM_H1_TRA, "Traffic-restart-allowed signal" },
218 { TRM_H1_TRW, "Traffic-restart-waiting signal (ANSI only)" },
221 /* Same as above but in acronym form (for the Info column) */
222 static const value_string trm_h1_message_type_acro_values[] = {
223 { TRM_H1_TRA, "TRA" },
224 { TRM_H1_TRW, "TRW" },
227 #define DLM_H1_DLC 0x01
228 #define DLM_H1_CSS 0x02
229 #define DLM_H1_CNS 0x03
230 #define DLM_H1_CNP 0x04
231 static const value_string dlm_h1_message_type_values[] = {
232 { DLM_H1_DLC, "Signalling-data-link-connection-order signal" },
233 { DLM_H1_CSS, "Connection-successful signal" },
234 { DLM_H1_CNS, "Connection-not-successful signal" },
235 { DLM_H1_CNP, "Connection-not-possible signal" },
238 /* Same as above but in acronym form (for the Info column) */
239 static const value_string dlm_h1_message_type_acro_values[] = {
240 { DLM_H1_DLC, "DLC" },
241 { DLM_H1_CSS, "CSS" },
242 { DLM_H1_CNS, "CNS" },
243 { DLM_H1_CNP, "CNP" },
246 #define UFC_H1_UPU 0x01
247 static const value_string ufc_h1_message_type_values[] = {
248 { UFC_H1_UPU, "User part unavailable signal" },
251 /* Same as above but in acronym form (for the Info column) */
252 static const value_string ufc_h1_message_type_acro_values[] = {
253 { UFC_H1_UPU, "UPU" },
256 static const value_string upu_cause_values[] = {
258 { 0x1, "Unequipped remote user" },
259 { 0x2, "Inaccessible remote user" },
262 #define TEST_H1_SLTM 0x1
263 #define TEST_H1_SLTA 0x2
264 static const value_string test_h1_message_type_values[] = {
265 { TEST_H1_SLTM, "Signalling link test message" },
266 { TEST_H1_SLTA, "Signalling link test acknowledgement message" },
269 /* Same as above but in acronym form (for the Info column) */
270 static const value_string test_h1_message_type_acro_values[] = {
271 { TEST_H1_SLTM, "SLTM" },
272 { TEST_H1_SLTA, "SLTA" },
277 #define ANSI_COO_SLC_MASK 0x000f
278 #define ANSI_COO_FSN_MASK 0x07f0
279 #define ITU_COO_FSN_MASK 0x007f
280 #define ANSI_XCO_LENGTH 4
281 #define ANSI_XCO_SLC_MASK 0x0000000f
282 #define ANSI_XCO_FSN_MASK 0x0ffffff0
283 #define ITU_XCO_LENGTH 3
284 #define ANSI_CBD_LENGTH 2
285 #define ANSI_CBD_SLC_MASK 0x000f
286 #define ANSI_CBD_CBC_MASK 0x0ff0
287 #define ITU_CBD_LENGTH 1
289 #define ANSI_ECO_LENGTH 1
290 #define ANSI_ECO_SLC_MASK 0x0f
292 #define ANSI_TFC_STATUS_LENGTH 1
293 #define ANSI_TFC_STATUS_OFFSET ANSI_PC_LENGTH
294 #define ANSI_TFC_STATUS_MASK 0x03
295 #define ITU_TFC_STATUS_LENGTH ITU_PC_LENGTH
296 #define ITU_TFC_STATUS_MASK 0xc000
298 #define ANSI_MIM_LENGTH 1
299 #define ANSI_MIM_SLC_MASK 0x0f
301 #define ANSI_DLC_LENGTH 3
302 #define ANSI_DLC_SLC_MASK 0x0000f
303 #define ANSI_DLC_LINK_MASK 0x3fff0
304 #define ITU_DLC_LENGTH 2
305 #define ITU_DLC_LINK_MASK 0x0fff
307 #define ANSI_UPU_USER_OFFSET ANSI_PC_LENGTH
308 #define UPU_USER_LENGTH 1
309 #define UPU_USER_MASK 0x0f
310 #define UPU_CAUSE_MASK 0xf0
311 #define ITU_UPU_USER_OFFSET ITU_PC_LENGTH
313 #define TEST_LENGTH 1
314 #define TEST_LENGTH_MASK 0xf0
315 #define TEST_LENGTH_SHIFT 4
316 #define TEST_PATTERN_OFFSET TEST_LENGTH
318 /* This list is slightly different from that in packet-mtp3.c */
319 static const value_string service_indicator_code_vals[] = {
326 { 0x6, "DUP (call and circuit related messages)" },
327 { 0x7, "DUP (facility registration and cancellation message)" },
328 { 0x8, "MTP testing user part" },
339 /* Initialize the protocol and registered fields */
340 static int proto_mtp3mg = -1;
341 static int hf_mtp3mg_h0 = -1;
342 static int hf_mtp3mg_chm_h1 = -1;
343 static int hf_mtp3mg_ecm_h1 = -1;
344 static int hf_mtp3mg_fcm_h1 = -1;
345 static int hf_mtp3mg_tfm_h1 = -1;
346 static int hf_mtp3mg_rsm_h1 = -1;
347 static int hf_mtp3mg_mim_h1 = -1;
348 static int hf_mtp3mg_trm_h1 = -1;
349 static int hf_mtp3mg_dlm_h1 = -1;
350 static int hf_mtp3mg_ufc_h1 = -1;
351 static int hf_mtp3mg_coo_ansi_slc = -1;
352 static int hf_mtp3mg_coo_ansi_fsn = -1;
353 static int hf_mtp3mg_coo_itu_fsn = -1;
354 static int hf_mtp3mg_xco_ansi_slc = -1;
355 static int hf_mtp3mg_xco_ansi_fsn = -1;
356 static int hf_mtp3mg_xco_itu_fsn = -1;
357 static int hf_mtp3mg_cbd_ansi_slc = -1;
358 static int hf_mtp3mg_cbd_ansi_cbc = -1;
359 static int hf_mtp3mg_cbd_itu_cbc = -1;
360 static int hf_mtp3mg_eco_ansi_slc = -1;
361 static int hf_mtp3mg_tfc_ansi_apc = -1;
362 static int hf_mtp3mg_tfc_apc_member = -1;
363 static int hf_mtp3mg_tfc_apc_cluster = -1;
364 static int hf_mtp3mg_tfc_apc_network = -1;
365 static int hf_mtp3mg_tfc_ansi_status = -1;
366 static int hf_mtp3mg_tfc_itu_apc = -1;
367 static int hf_mtp3mg_tfc_itu_status = -1;
368 static int hf_mtp3mg_tfc_chinese_apc = -1;
369 static int hf_mtp3mg_tfm_ansi_apc = -1;
370 static int hf_mtp3mg_tfm_apc_member = -1;
371 static int hf_mtp3mg_tfm_apc_cluster = -1;
372 static int hf_mtp3mg_tfm_apc_network = -1;
373 static int hf_mtp3mg_tfm_itu_apc = -1;
374 static int hf_mtp3mg_tfm_chinese_apc = -1;
375 static int hf_mtp3mg_rsm_ansi_apc = -1;
376 static int hf_mtp3mg_rsm_apc_member = -1;
377 static int hf_mtp3mg_rsm_apc_cluster = -1;
378 static int hf_mtp3mg_rsm_apc_network = -1;
379 static int hf_mtp3mg_rsm_itu_apc = -1;
380 static int hf_mtp3mg_rsm_chinese_apc = -1;
381 static int hf_mtp3mg_mim_ansi_slc = -1;
382 static int hf_mtp3mg_dlc_ansi_slc = -1;
383 static int hf_mtp3mg_dlc_ansi_link = -1;
384 static int hf_mtp3mg_dlc_itu_link = -1;
385 static int hf_mtp3mg_upu_ansi_apc = -1;
386 static int hf_mtp3mg_upu_apc_member = -1;
387 static int hf_mtp3mg_upu_apc_cluster = -1;
388 static int hf_mtp3mg_upu_apc_network = -1;
389 static int hf_mtp3mg_upu_itu_apc = -1;
390 static int hf_mtp3mg_upu_chinese_apc = -1;
391 static int hf_mtp3mg_upu_user = -1;
392 static int hf_mtp3mg_upu_cause = -1;
393 static int hf_mtp3test_h0 = -1;
394 static int hf_mtp3mg_test_h1 = -1;
395 static int hf_mtp3mg_test_length = -1;
397 /* Initialize the subtree pointers */
398 static gint ett_mtp3mg = -1;
399 static gint ett_mtp3mg_fcm_apc = -1;
400 static gint ett_mtp3mg_tfm_apc = -1;
401 static gint ett_mtp3mg_rsm_apc = -1;
402 static gint ett_mtp3mg_upu_apc = -1;
405 dissect_mtp3mg_unknown_message(tvbuff_t *tvb, proto_tree *tree)
407 guint8 message_length;
409 message_length = tvb_length_remaining(tvb, 0);
410 proto_tree_add_text(tree, tvb, 0, message_length,
411 "Unknown message (%u byte%s)", message_length,
412 plurality(message_length, "", "s"));
416 dissect_mtp3mg_chm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
419 if (check_col(pinfo->cinfo, COL_INFO))
420 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
421 val_to_str(h1, chm_h1_message_type_acro_values, "Unknown"));
427 if (mtp3_standard == ANSI_STANDARD)
429 proto_tree_add_item(tree, hf_mtp3mg_coo_ansi_slc, tvb, 0,
431 proto_tree_add_item(tree, hf_mtp3mg_coo_ansi_fsn, tvb, 0,
433 } else /* ITU_STANDARD and CHINESE_ITU_STANDARD */ {
434 proto_tree_add_item(tree, hf_mtp3mg_coo_itu_fsn, tvb, 0,
441 if (mtp3_standard == ANSI_STANDARD)
443 proto_tree_add_item(tree, hf_mtp3mg_xco_ansi_slc, tvb, 0,
444 ANSI_XCO_LENGTH, TRUE);
445 proto_tree_add_item(tree, hf_mtp3mg_xco_ansi_fsn, tvb, 0,
446 ANSI_XCO_LENGTH, TRUE);
447 } else /* ITU_STANDARD and CHINESE_ITU_STANDARD */ {
448 proto_tree_add_item(tree, hf_mtp3mg_xco_itu_fsn, tvb, 0,
449 ITU_XCO_LENGTH, TRUE);
455 if (mtp3_standard == ANSI_STANDARD)
457 proto_tree_add_item(tree, hf_mtp3mg_cbd_ansi_slc, tvb, 0,
458 ANSI_CBD_LENGTH, TRUE);
459 proto_tree_add_item(tree, hf_mtp3mg_cbd_ansi_cbc, tvb, 0,
460 ANSI_CBD_LENGTH, TRUE);
461 } else /* ITU_STANDARD and CHINESE_ITU_STANDARD */ {
462 proto_tree_add_item(tree, hf_mtp3mg_cbd_itu_cbc, tvb, 0,
463 ITU_CBD_LENGTH, TRUE);
468 dissect_mtp3mg_unknown_message(tvb, tree);
473 dissect_mtp3mg_ecm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
476 if (check_col(pinfo->cinfo, COL_INFO))
477 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
478 val_to_str(h1, ecm_h1_message_type_acro_values, "Unknown"));
484 if (mtp3_standard == ANSI_STANDARD)
486 proto_tree_add_item(tree, hf_mtp3mg_eco_ansi_slc, tvb, 0,
487 ANSI_ECO_LENGTH, TRUE);
489 /* else: nothing to dissect */
493 dissect_mtp3mg_unknown_message(tvb, tree);
498 dissect_mtp3mg_3byte_pc(tvbuff_t *tvb, proto_tree *tree, gint *ett_pc,
499 int *hf_pc, int *hf_pc_member, int *hf_pc_cluster,
503 proto_item *apc_item;
504 proto_tree *apc_tree;
505 char pc[ANSI_PC_STRING_LENGTH];
507 apc = tvb_get_ntoh24(tvb, 0);
509 snprintf(pc, sizeof(pc), "%d-%d-%d",
510 (apc & ANSI_NETWORK_MASK),
511 ((apc & ANSI_CLUSTER_MASK) >> 8),
512 ((apc & ANSI_MEMBER_MASK) >> 16));
514 apc_item = proto_tree_add_string_format(tree, *hf_pc, tvb, 0,
516 "Affected PC (%s)", pc);
518 apc_tree = proto_item_add_subtree(apc_item, *ett_pc);
520 proto_tree_add_uint(apc_tree, *hf_pc_member, tvb,
521 ANSI_MEMBER_OFFSET, ANSI_NCM_LENGTH, apc);
522 proto_tree_add_uint(apc_tree, *hf_pc_cluster, tvb,
523 ANSI_CLUSTER_OFFSET, ANSI_NCM_LENGTH, apc);
524 proto_tree_add_uint(apc_tree, *hf_pc_network, tvb,
525 ANSI_NETWORK_OFFSET, ANSI_NCM_LENGTH, apc);
530 dissect_mtp3mg_fcm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
533 if (check_col(pinfo->cinfo, COL_INFO))
534 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
535 val_to_str(h1, fcm_h1_message_type_acro_values, "Unknown"));
540 /* nothing to dissect */
544 if (mtp3_standard == ITU_STANDARD) {
546 proto_tree_add_item(tree, hf_mtp3mg_tfc_itu_apc, tvb, 0,
547 ITU_PC_LENGTH, TRUE);
549 /* Congestion level is a national option */
550 proto_tree_add_item(tree, hf_mtp3mg_tfc_itu_status, tvb, 0,
551 ITU_TFC_STATUS_LENGTH, TRUE);
555 } else /* ANSI_STANDARD and CHINESE_ITU_STANDARD */ {
559 if (mtp3_standard == ANSI_STANDARD) {
561 hf_apc_string = &hf_mtp3mg_tfc_ansi_apc;
563 } else /* CHINESE_ITU_STANDARD */ {
565 hf_apc_string = &hf_mtp3mg_tfc_chinese_apc;
568 dissect_mtp3mg_3byte_pc(tvb, tree, &ett_mtp3mg_fcm_apc,
570 &hf_mtp3mg_tfc_apc_member,
571 &hf_mtp3mg_tfc_apc_cluster,
572 &hf_mtp3mg_tfc_apc_network);
574 proto_tree_add_item(tree, hf_mtp3mg_tfc_ansi_status, tvb,
575 ANSI_TFC_STATUS_OFFSET, ANSI_TFC_STATUS_LENGTH,
582 dissect_mtp3mg_unknown_message(tvb, tree);
587 dissect_mtp3mg_tfm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
590 if (check_col(pinfo->cinfo, COL_INFO))
591 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
592 val_to_str(h1, tfm_h1_message_type_acro_values, "Unknown"));
602 if (mtp3_standard == ANSI_STANDARD)
604 dissect_mtp3mg_3byte_pc(tvb, tree, &ett_mtp3mg_tfm_apc,
605 &hf_mtp3mg_tfm_ansi_apc,
606 &hf_mtp3mg_tfm_apc_member,
607 &hf_mtp3mg_tfm_apc_cluster,
608 &hf_mtp3mg_tfm_apc_network);
610 } else /* ITU_STANDARD and CHINESE_ITU_STANDARD */ {
612 if (h1 == TFM_H1_TCP || h1 == TFM_H1_TCR || h1 == TFM_H1_TCA)
613 dissect_mtp3mg_unknown_message(tvb, tree);
614 else if (mtp3_standard == ITU_STANDARD)
615 proto_tree_add_item(tree, hf_mtp3mg_tfm_itu_apc, tvb, 0,
616 ITU_PC_LENGTH, TRUE);
617 else /* CHINESE_ITU_STANDARD */
618 dissect_mtp3mg_3byte_pc(tvb, tree, &ett_mtp3mg_tfm_apc,
619 &hf_mtp3mg_tfm_chinese_apc,
620 &hf_mtp3mg_tfm_apc_member,
621 &hf_mtp3mg_tfm_apc_cluster,
622 &hf_mtp3mg_tfm_apc_network);
627 dissect_mtp3mg_unknown_message(tvb, tree);
632 dissect_mtp3mg_rsm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
635 if (check_col(pinfo->cinfo, COL_INFO))
636 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
637 val_to_str(h1, rsm_h1_message_type_acro_values, "Unknown"));
645 if (mtp3_standard == ANSI_STANDARD)
647 dissect_mtp3mg_3byte_pc(tvb, tree, &ett_mtp3mg_rsm_apc,
648 &hf_mtp3mg_rsm_ansi_apc,
649 &hf_mtp3mg_rsm_apc_member,
650 &hf_mtp3mg_rsm_apc_cluster,
651 &hf_mtp3mg_rsm_apc_network);
653 } else /* ITU_STANDARD and CHINESE_ITU_STANDARD */ {
655 if (h1 == RSM_H1_RST || h1 == RSM_H1_RSR)
657 if (mtp3_standard == ITU_STANDARD)
658 proto_tree_add_item(tree, hf_mtp3mg_rsm_itu_apc, tvb, 0,
659 ITU_PC_LENGTH, TRUE);
661 else /* CHINESE_ITU_STANDARD */
662 dissect_mtp3mg_3byte_pc(tvb, tree, &ett_mtp3mg_rsm_apc,
663 &hf_mtp3mg_rsm_chinese_apc,
664 &hf_mtp3mg_rsm_apc_member,
665 &hf_mtp3mg_rsm_apc_cluster,
666 &hf_mtp3mg_rsm_apc_network);
668 dissect_mtp3mg_unknown_message(tvb, tree);
673 dissect_mtp3mg_unknown_message(tvb, tree);
678 dissect_mtp3mg_mim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
681 if (check_col(pinfo->cinfo, COL_INFO))
682 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
683 val_to_str(h1, mim_h1_message_type_acro_values, "Unknown"));
695 if (mtp3_standard == ANSI_STANDARD)
697 proto_tree_add_item(tree, hf_mtp3mg_mim_ansi_slc, tvb, 0,
698 ANSI_MIM_LENGTH, TRUE);
700 /* else: nothing to dissect */
704 dissect_mtp3mg_unknown_message(tvb, tree);
709 dissect_mtp3mg_trm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
712 if (check_col(pinfo->cinfo, COL_INFO))
713 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
714 val_to_str(h1, trm_h1_message_type_acro_values, "Unknown"));
719 /* nothing to dissect */
722 if (mtp3_standard != ANSI_STANDARD)
723 dissect_mtp3mg_unknown_message(tvb, tree);
724 /* else: nothing to dissect */
728 dissect_mtp3mg_unknown_message(tvb, tree);
733 dissect_mtp3mg_dlm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
736 if (check_col(pinfo->cinfo, COL_INFO))
737 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
738 val_to_str(h1, dlm_h1_message_type_acro_values, "Unknown"));
743 if (mtp3_standard == ANSI_STANDARD)
745 proto_tree_add_item(tree, hf_mtp3mg_dlc_ansi_slc, tvb, 0,
746 ANSI_DLC_LENGTH, TRUE);
747 proto_tree_add_item(tree, hf_mtp3mg_dlc_ansi_link, tvb, 0,
748 ANSI_DLC_LENGTH, TRUE);
749 } else /* ITU_STANDARD and CHINESE_ITU_STANDARD */ {
750 proto_tree_add_item(tree, hf_mtp3mg_dlc_itu_link, tvb, 0,
751 ITU_DLC_LENGTH, TRUE);
757 /* nothing to dissect */
761 dissect_mtp3mg_unknown_message(tvb, tree);
766 dissect_mtp3mg_ufc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
769 if (check_col(pinfo->cinfo, COL_INFO))
770 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
771 val_to_str(h1, ufc_h1_message_type_acro_values, "Unknown"));
776 if (mtp3_standard == ANSI_STANDARD
777 || mtp3_standard == CHINESE_ITU_STANDARD)
781 if (mtp3_standard == ANSI_STANDARD)
782 hf_apc = &hf_mtp3mg_upu_ansi_apc;
783 else /* CHINESE_ITU_STANDARD */
784 hf_apc = &hf_mtp3mg_upu_chinese_apc;
786 dissect_mtp3mg_3byte_pc(tvb, tree, &ett_mtp3mg_upu_apc,
788 &hf_mtp3mg_rsm_apc_member,
789 &hf_mtp3mg_rsm_apc_cluster,
790 &hf_mtp3mg_rsm_apc_network);
792 proto_tree_add_item(tree, hf_mtp3mg_upu_user, tvb,
793 ANSI_UPU_USER_OFFSET, UPU_USER_LENGTH, TRUE);
794 proto_tree_add_item(tree, hf_mtp3mg_upu_cause, tvb,
795 ANSI_UPU_USER_OFFSET, UPU_USER_LENGTH, TRUE);
796 } else /* ITU_STANDARD */ {
797 proto_tree_add_item(tree, hf_mtp3mg_upu_itu_apc, tvb, 0,
798 ITU_PC_LENGTH, TRUE);
799 proto_tree_add_item(tree, hf_mtp3mg_upu_user, tvb,
800 ITU_UPU_USER_OFFSET, UPU_USER_LENGTH, TRUE);
801 proto_tree_add_item(tree, hf_mtp3mg_upu_cause, tvb,
802 ITU_UPU_USER_OFFSET, UPU_USER_LENGTH, TRUE);
807 dissect_mtp3mg_unknown_message(tvb, tree);
812 dissect_mtp3mg_test(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
817 if (check_col(pinfo->cinfo, COL_INFO))
818 col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
819 val_to_str(h1, test_h1_message_type_acro_values, "Unknown"));
825 proto_tree_add_item(tree, hf_mtp3mg_test_length, tvb, 0, TEST_LENGTH,
828 length = tvb_get_guint8(tvb, 0) >> TEST_LENGTH_SHIFT;
829 proto_tree_add_text(tree, tvb, TEST_PATTERN_OFFSET, length,
830 "Test pattern (%u byte%s)", length,
831 plurality(length, "", "s"));
835 dissect_mtp3mg_unknown_message(tvb, tree);
840 dissect_mtp3mg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
844 tvbuff_t *payload_tvb;
846 /* Set up structures needed to add the protocol subtree and manage it */
847 proto_item *mtp3mg_item = NULL;
848 proto_tree *mtp3mg_tree = NULL;
850 /* Make entries in Protocol column and Info column on summary display */
851 switch(mtp3_standard) {
853 col_set_str(pinfo->cinfo, COL_PROTOCOL, "MTP3MG (Int. ITU)");
856 col_set_str(pinfo->cinfo, COL_PROTOCOL, "MTP3MG (ANSI)");
858 case CHINESE_ITU_STANDARD:
859 col_set_str(pinfo->cinfo, COL_PROTOCOL, "MTP3MG (Chin. ITU)");
864 /* create display subtree for the protocol */
865 mtp3mg_item = proto_tree_add_item(tree, proto_mtp3mg, tvb, 0, -1,
867 mtp3mg_tree = proto_item_add_subtree(mtp3mg_item, ett_mtp3mg);
871 * Dissect the message
873 if(pinfo->private_data == (void *)MTP3MG_ANSI_TEST_SI ||
874 pinfo->private_data == (void *)MTP3MG_ITU_TEST_SI)
875 { /* Test messages */
877 proto_tree_add_item(mtp3mg_tree, hf_mtp3test_h0, tvb, 0, H0H1_LENGTH,
879 /* H1 is added below */
881 h0 = tvb_get_guint8(tvb, 0) & H0_MASK;
882 h1 = (tvb_get_guint8(tvb, 0) & H1_MASK) >> H1_SHIFT;
884 payload_tvb = tvb_new_subset(tvb, H0H1_LENGTH, -1, -1);
889 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_test_h1, tvb, 0,
891 dissect_mtp3mg_test(payload_tvb, pinfo, mtp3mg_tree, h1);
895 if (check_col(pinfo->cinfo, COL_INFO))
896 col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown ");
898 dissect_mtp3mg_unknown_message(tvb, mtp3mg_tree);
901 } else { /* Real management messages */
903 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_h0, tvb, 0, H0H1_LENGTH,
905 /* H1 is added below */
907 h0 = tvb_get_guint8(tvb, 0) & H0_MASK;
908 h1 = (tvb_get_guint8(tvb, 0) & H1_MASK) >> H1_SHIFT;
910 payload_tvb = tvb_new_subset(tvb, H0H1_LENGTH, -1, -1);
915 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_chm_h1, tvb, 0,
917 dissect_mtp3mg_chm(payload_tvb, pinfo, mtp3mg_tree, h1);
920 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_ecm_h1, tvb, 0,
922 dissect_mtp3mg_ecm(payload_tvb, pinfo, mtp3mg_tree, h1);
925 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_fcm_h1, tvb, 0,
927 dissect_mtp3mg_fcm(payload_tvb, pinfo, mtp3mg_tree, h1);
930 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_tfm_h1, tvb, 0,
932 dissect_mtp3mg_tfm(payload_tvb, pinfo, mtp3mg_tree, h1);
935 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_rsm_h1, tvb, 0,
937 dissect_mtp3mg_rsm(payload_tvb, pinfo, mtp3mg_tree, h1);
940 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_mim_h1, tvb, 0,
942 dissect_mtp3mg_mim(payload_tvb, pinfo, mtp3mg_tree, h1);
945 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_trm_h1, tvb, 0,
947 dissect_mtp3mg_trm(payload_tvb, pinfo, mtp3mg_tree, h1);
950 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_dlm_h1, tvb, 0,
952 dissect_mtp3mg_dlm(payload_tvb, pinfo, mtp3mg_tree, h1);
955 proto_tree_add_item(mtp3mg_tree, hf_mtp3mg_ufc_h1, tvb, 0,
957 dissect_mtp3mg_ufc(payload_tvb, pinfo, mtp3mg_tree, h1);
961 if (check_col(pinfo->cinfo, COL_INFO))
962 col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown ");
964 dissect_mtp3mg_unknown_message(tvb, mtp3mg_tree);
971 proto_register_mtp3mg(void)
974 /* Setup list of header fields See Section 1.6.1 for details*/
975 static hf_register_info hf[] = {
977 { "H0 (Message Group)", "mtp3mg.h0",
978 FT_UINT8, BASE_HEX, VALS(h0_message_type_values), H0_MASK,
979 "Message group identifier", HFILL }},
981 { "H1 (Message)", "mtp3mg.h1",
982 FT_UINT8, BASE_HEX, VALS(chm_h1_message_type_values), H1_MASK,
983 "Message type", HFILL }},
985 { "H1 (Message)", "mtp3mg.h1",
986 FT_UINT8, BASE_HEX, VALS(ecm_h1_message_type_values), H1_MASK,
987 "Message type", HFILL }},
989 { "H1 (Message)", "mtp3mg.h1",
990 FT_UINT8, BASE_HEX, VALS(fcm_h1_message_type_values), H1_MASK,
991 "Message type", HFILL }},
993 { "H1 (Message)", "mtp3mg.h1",
994 FT_UINT8, BASE_HEX, VALS(tfm_h1_message_type_values), H1_MASK,
995 "Message type", HFILL }},
997 { "H1 (Message)", "mtp3mg.h1",
998 FT_UINT8, BASE_HEX, VALS(rsm_h1_message_type_values), H1_MASK,
999 "Message type", HFILL }},
1000 { &hf_mtp3mg_mim_h1,
1001 { "H1 (Message)", "mtp3mg.h1",
1002 FT_UINT8, BASE_HEX, VALS(mim_h1_message_type_values), H1_MASK,
1003 "Message type", HFILL }},
1004 { &hf_mtp3mg_trm_h1,
1005 { "H1 (Message)", "mtp3mg.h1",
1006 FT_UINT8, BASE_HEX, VALS(trm_h1_message_type_values), H1_MASK,
1007 "Message type", HFILL }},
1008 { &hf_mtp3mg_dlm_h1,
1009 { "H1 (Message)", "mtp3mg.h1",
1010 FT_UINT8, BASE_HEX, VALS(dlm_h1_message_type_values), H1_MASK,
1011 "Message type", HFILL }},
1012 { &hf_mtp3mg_ufc_h1,
1013 { "H1 (Message)", "mtp3mg.h1",
1014 FT_UINT8, BASE_HEX, VALS(ufc_h1_message_type_values), H1_MASK,
1015 "Message type", HFILL }},
1016 { &hf_mtp3mg_coo_ansi_slc,
1017 { "Signalling Link Code", "mtp3mg.slc",
1018 FT_UINT8, BASE_DEC, NULL, ANSI_COO_SLC_MASK,
1019 "SLC of affected link", HFILL }},
1020 { &hf_mtp3mg_coo_ansi_fsn,
1021 { "Forward Sequence Number", "mtp3mg.fsn",
1022 FT_UINT8, BASE_DEC, NULL, ANSI_COO_FSN_MASK,
1023 "Forward Sequence Number of last accepted message", HFILL }},
1024 { &hf_mtp3mg_coo_itu_fsn,
1025 { "Forward Sequence Number", "mtp3mg.fsn",
1026 FT_UINT8, BASE_DEC, NULL, ITU_COO_FSN_MASK,
1027 "Forward Sequence Number of last accepted message", HFILL }},
1028 { &hf_mtp3mg_xco_ansi_slc,
1029 { "Signalling Link Code", "mtp3mg.slc",
1030 FT_UINT32, BASE_DEC, NULL, ANSI_XCO_SLC_MASK,
1031 "SLC of affected link", HFILL }},
1032 { &hf_mtp3mg_xco_ansi_fsn,
1033 { "Forward Sequence Number", "mtp3mg.fsn",
1034 FT_UINT32, BASE_DEC, NULL, ANSI_XCO_FSN_MASK,
1035 "Forward Sequence Number of last accepted message", HFILL }},
1036 { &hf_mtp3mg_xco_itu_fsn,
1037 { "Forward Sequence Number", "mtp3mg.fsn",
1038 FT_UINT24, BASE_DEC, NULL, 0x0,
1039 "Forward Sequence Number of last accepted message", HFILL }},
1040 { &hf_mtp3mg_cbd_ansi_slc,
1041 { "Signalling Link Code", "mtp3mg.slc",
1042 FT_UINT16, BASE_DEC, NULL, ANSI_CBD_SLC_MASK,
1043 "SLC of affected link", HFILL }},
1044 { &hf_mtp3mg_cbd_ansi_cbc,
1045 { "Change Back Code", "mtp3mg.cbc",
1046 FT_UINT16, BASE_DEC, NULL, ANSI_CBD_CBC_MASK,
1048 { &hf_mtp3mg_cbd_itu_cbc,
1049 { "Change Back Code", "mtp3mg.cbc",
1050 FT_UINT8, BASE_DEC, NULL, 0x0,
1052 { &hf_mtp3mg_eco_ansi_slc,
1053 { "Signalling Link Code", "mtp3mg.slc",
1054 FT_UINT8, BASE_DEC, NULL, ANSI_ECO_SLC_MASK,
1055 "SLC of affected link", HFILL }},
1056 { &hf_mtp3mg_tfc_ansi_apc,
1057 { "Affected Point Code", "mtp3mg.ansi_apc",
1058 FT_STRING, BASE_NONE, NULL, 0x0,
1060 { &hf_mtp3mg_tfc_apc_member,
1061 { "Affected Point Code member", "mtp3mg.apc.member",
1062 FT_UINT24, BASE_DEC, NULL, ANSI_MEMBER_MASK,
1064 { &hf_mtp3mg_tfc_apc_cluster,
1065 { "Affected Point Code cluster", "mtp3mg.apc.cluster",
1066 FT_UINT24, BASE_DEC, NULL, ANSI_CLUSTER_MASK,
1068 { &hf_mtp3mg_tfc_apc_network,
1069 { "Affected Point Code network", "mtp3mg.apc.network",
1070 FT_UINT24, BASE_DEC, NULL, ANSI_NETWORK_MASK,
1072 { &hf_mtp3mg_tfc_ansi_status,
1073 { "Status", "mtp3mg.status",
1074 FT_UINT8, BASE_DEC, NULL, ANSI_TFC_STATUS_MASK,
1075 "Congestion status", HFILL }},
1076 { &hf_mtp3mg_tfc_itu_apc,
1077 { "Affected Point Code (ITU)", "mtp3mg.apc",
1078 FT_UINT8, BASE_DEC, NULL, ITU_PC_MASK,
1080 { &hf_mtp3mg_tfc_itu_status,
1081 { "Status", "mtp3mg.status",
1082 FT_UINT8, BASE_DEC, NULL, ITU_TFC_STATUS_MASK,
1083 "Congestion status", HFILL }},
1084 { &hf_mtp3mg_tfc_chinese_apc,
1085 { "Affected Point Code", "mtp3mg.chinese_apc",
1086 FT_STRING, BASE_NONE, NULL, 0x0,
1088 { &hf_mtp3mg_tfm_ansi_apc,
1089 { "Affected Point Code", "mtp3mg.ansi_apc",
1090 FT_STRING, BASE_NONE, NULL, 0x0,
1092 { &hf_mtp3mg_tfm_apc_member,
1093 { "Affected Point Code member", "mtp3mg.apc.member",
1094 FT_UINT24, BASE_DEC, NULL, ANSI_MEMBER_MASK,
1096 { &hf_mtp3mg_tfm_apc_cluster,
1097 { "Affected Point Code cluster", "mtp3mg.apc.cluster",
1098 FT_UINT24, BASE_DEC, NULL, ANSI_CLUSTER_MASK,
1100 { &hf_mtp3mg_tfm_apc_network,
1101 { "Affected Point Code network", "mtp3mg.apc.network",
1102 FT_UINT24, BASE_DEC, NULL, ANSI_NETWORK_MASK,
1104 { &hf_mtp3mg_tfm_itu_apc,
1105 { "Affected Point Code (ITU)", "mtp3mg.apc",
1106 FT_UINT8, BASE_DEC, NULL, ITU_PC_MASK,
1108 { &hf_mtp3mg_tfm_chinese_apc,
1109 { "Affected Point Code", "mtp3mg.chinese_apc",
1110 FT_STRING, BASE_NONE, NULL, 0x0,
1112 { &hf_mtp3mg_rsm_ansi_apc,
1113 { "Affected Point Code", "mtp3mg.ansi_apc",
1114 FT_STRING, BASE_NONE, NULL, 0x0,
1116 { &hf_mtp3mg_rsm_apc_member,
1117 { "Affected Point Code member", "mtp3mg.apc.member",
1118 FT_UINT24, BASE_DEC, NULL, ANSI_MEMBER_MASK,
1120 { &hf_mtp3mg_rsm_apc_cluster,
1121 { "Affected Point Code cluster", "mtp3mg.apc.cluster",
1122 FT_UINT24, BASE_DEC, NULL, ANSI_CLUSTER_MASK,
1124 { &hf_mtp3mg_rsm_apc_network,
1125 { "Affected Point Code network", "mtp3mg.apc.network",
1126 FT_UINT24, BASE_DEC, NULL, ANSI_NETWORK_MASK,
1128 { &hf_mtp3mg_rsm_itu_apc,
1129 { "Affected Point Code (ITU)", "mtp3mg.apc",
1130 FT_UINT8, BASE_DEC, NULL, ITU_PC_MASK,
1132 { &hf_mtp3mg_rsm_chinese_apc,
1133 { "Affected Point Code", "mtp3mg.chinese_apc",
1134 FT_STRING, BASE_NONE, NULL, 0x0,
1136 { &hf_mtp3mg_mim_ansi_slc,
1137 { "Signalling Link Code", "mtp3mg.slc",
1138 FT_UINT8, BASE_DEC, NULL, ANSI_MIM_SLC_MASK,
1139 "SLC of affected link", HFILL }},
1140 { &hf_mtp3mg_dlc_ansi_slc,
1141 { "Signalling Link Code", "mtp3mg.slc",
1142 FT_UINT8, BASE_DEC, NULL, ANSI_DLC_SLC_MASK,
1143 "SLC of affected link", HFILL }},
1144 { &hf_mtp3mg_dlc_ansi_link,
1145 { "Link", "mtp3mg.link",
1146 FT_UINT8, BASE_DEC, NULL, ANSI_DLC_LINK_MASK,
1147 "CIC of BIC used to carry data", HFILL }},
1148 { &hf_mtp3mg_dlc_itu_link,
1149 { "Link", "mtp3mg.link",
1150 FT_UINT8, BASE_DEC, NULL, ITU_DLC_LINK_MASK,
1151 "CIC of BIC used to carry data", HFILL }},
1152 { &hf_mtp3mg_upu_ansi_apc,
1153 { "Affected Point Code", "mtp3mg.ansi_apc",
1154 FT_STRING, BASE_NONE, NULL, 0x0,
1156 { &hf_mtp3mg_upu_apc_member,
1157 { "Affected Point Code member", "mtp3mg.apc.member",
1158 FT_UINT24, BASE_DEC, NULL, ANSI_MEMBER_MASK,
1160 { &hf_mtp3mg_upu_apc_cluster,
1161 { "Affected Point Code cluster", "mtp3mg.apc.cluster",
1162 FT_UINT24, BASE_DEC, NULL, ANSI_CLUSTER_MASK,
1164 { &hf_mtp3mg_upu_apc_network,
1165 { "Affected Point Code network", "mtp3mg.apc.network",
1166 FT_UINT24, BASE_DEC, NULL, ANSI_NETWORK_MASK,
1168 { &hf_mtp3mg_upu_itu_apc,
1169 { "Affected Point Code", "mtp3mg.apc",
1170 FT_UINT8, BASE_DEC, NULL, ITU_PC_MASK,
1172 { &hf_mtp3mg_upu_chinese_apc,
1173 { "Affected Point Code", "mtp3mg.chinese_apc",
1174 FT_STRING, BASE_NONE, NULL, 0x0,
1176 { &hf_mtp3mg_upu_user,
1177 { "User", "mtp3mg.user",
1178 FT_UINT8, BASE_HEX, VALS(service_indicator_code_vals), UPU_USER_MASK,
1179 "Unavailable user part", HFILL }},
1180 { &hf_mtp3mg_upu_cause,
1181 { "Cause", "mtp3mg.cause",
1182 FT_UINT8, BASE_HEX, VALS(upu_cause_values), UPU_CAUSE_MASK,
1183 "Cause of user unavailability", HFILL }},
1185 { "H0 (Message Group)", "mtp3mg.test.h0",
1186 FT_UINT8, BASE_HEX, VALS(test_h0_message_type_values), H0_MASK,
1187 "Message group identifier", HFILL }},
1188 { &hf_mtp3mg_test_h1,
1189 { "H1 (Message)", "mtp3mg.test.h1",
1190 FT_UINT8, BASE_HEX, VALS(test_h1_message_type_values), H1_MASK,
1191 "SLT message type", HFILL }},
1192 { &hf_mtp3mg_test_length,
1193 { "Test length", "mtp3mg.test.length",
1194 FT_UINT8, BASE_DEC, NULL, H1_MASK,
1195 "Signalling link test pattern length", HFILL }}
1198 /* Setup protocol subtree array */
1199 static gint *ett[] = {
1201 &ett_mtp3mg_fcm_apc,
1202 &ett_mtp3mg_tfm_apc,
1203 &ett_mtp3mg_rsm_apc,
1207 /* Register the protocol name and description */
1208 proto_mtp3mg = proto_register_protocol("Message Transfer Part Level 3 Management",
1209 "MTP3MG", "mtp3mg");
1210 register_dissector("mtp3mg", dissect_mtp3mg, proto_mtp3mg);
1212 /* Required calls to register the header fields and subtrees used */
1213 proto_register_field_array(proto_mtp3mg, hf, array_length(hf));
1214 proto_register_subtree_array(ett, array_length(ett));
1219 proto_reg_handoff_mtp3mg(void)
1221 dissector_handle_t mtp3mg_handle;
1223 mtp3mg_handle = create_dissector_handle(dissect_mtp3mg, proto_mtp3mg);
1225 dissector_add("mtp3.service_indicator", MTP3MG_SI, mtp3mg_handle);
1227 /* SI 1 is unused in ANSI and SI 2 is unused in ITU, so it's okay for us
1228 * to grab both (regardless of mtp3.standard setting) here.
1230 dissector_add("mtp3.service_indicator", MTP3MG_ITU_TEST_SI, mtp3mg_handle);
1231 dissector_add("mtp3.service_indicator", MTP3MG_ANSI_TEST_SI, mtp3mg_handle);