- guint32 label;
- proto_item *label_item;
- proto_tree *label_tree;
-
- label_item = proto_tree_add_text(mtp3_tree, tvb, ITU_ROUTING_LABEL_OFFSET, ITU_ROUTING_LABEL_LENGTH, "Routing label");
- label_tree = proto_item_add_subtree(label_item, ett_mtp3_label);
-
- label = tvb_get_letohl(tvb, ITU_ROUTING_LABEL_OFFSET);
- proto_tree_add_uint(label_tree, hf_mtp3_dpc,
- tvb, ITU_ROUTING_LABEL_OFFSET, ITU_ROUTING_LABEL_LENGTH,
- label);
- proto_tree_add_uint(label_tree, hf_mtp3_opc,
- tvb, ITU_ROUTING_LABEL_OFFSET, ITU_ROUTING_LABEL_LENGTH,
- label);
- proto_tree_add_uint(label_tree, hf_mtp3_sls,
- tvb, ITU_ROUTING_LABEL_OFFSET, ITU_ROUTING_LABEL_LENGTH,
- label);
+ guint32 label, dpc, opc;
+ guint8 sls;
+ proto_item *label_item, *label_dpc_item, *label_opc_item;
+ proto_tree *label_tree, *label_dpc_tree, *label_opc_tree;
+
+ switch (mtp3_standard) {
+ case ITU_STANDARD:
+ label_item = proto_tree_add_text(mtp3_tree, tvb, ITU_ROUTING_LABEL_OFFSET,
+ ITU_ROUTING_LABEL_LENGTH, "Routing label");
+ label_tree = proto_item_add_subtree(label_item, ett_mtp3_label);
+
+ label = tvb_get_letohl(tvb, ITU_ROUTING_LABEL_OFFSET);
+ sls = tvb_get_guint8(tvb, ITU_ROUTING_LABEL_OFFSET);
+
+ proto_tree_add_uint(label_tree, hf_mtp3_itu_dpc, tvb,
+ ITU_ROUTING_LABEL_OFFSET, ITU_ROUTING_LABEL_LENGTH,
+ label);
+ proto_tree_add_uint(label_tree, hf_mtp3_itu_opc, tvb,
+ ITU_ROUTING_LABEL_OFFSET, ITU_ROUTING_LABEL_LENGTH,
+ label);
+ proto_tree_add_uint(label_tree, hf_mtp3_itu_sls, tvb,
+ ITU_SLS_OFFSET, ITU_SLS_LENGTH,
+ sls);
+ break;
+
+ case ANSI_STANDARD:
+ /* this could be 5 or 8 bits */
+ sls = tvb_get_guint8(tvb, ANSI_SLS_OFFSET);
+
+ /* Create the Routing Label Tree */
+ label_item = proto_tree_add_text(mtp3_tree, tvb, ANSI_ROUTING_LABEL_OFFSET,
+ ANSI_ROUTING_LABEL_LENGTH, "Routing label");
+ label_tree = proto_item_add_subtree(label_item, ett_mtp3_label);
+
+ /* create the DPC tree */
+ dpc = tvb_get_ntoh24(tvb, ANSI_DPC_OFFSET);
+ label_dpc_item = proto_tree_add_text(label_tree, tvb, ANSI_DPC_OFFSET,
+ ANSI_DPC_LENGTH,
+ "DPC (%d-%d-%d)",
+ (dpc & ANSI_NETWORK_MASK),
+ ((dpc & ANSI_CLUSTER_MASK) >> 8),
+ ((dpc & ANSI_MEMBER_MASK) >> 16));
+
+ label_dpc_tree = proto_item_add_subtree(label_dpc_item,
+ ett_mtp3_label_dpc);
+
+ proto_tree_add_uint(label_dpc_tree, hf_mtp3_dpc_member,
+ tvb, ANSI_DPC_OFFSET, ANSI_NCM_LENGTH, dpc);
+ proto_tree_add_uint(label_dpc_tree, hf_mtp3_dpc_cluster,
+ tvb, ANSI_DPC_OFFSET, ANSI_NCM_LENGTH, dpc);
+ proto_tree_add_uint(label_dpc_tree, hf_mtp3_dpc_network,
+ tvb, ANSI_DPC_OFFSET, ANSI_NCM_LENGTH, dpc);
+
+ /* create the OPC tree */
+ opc = tvb_get_ntoh24(tvb, ANSI_OPC_OFFSET);
+
+ label_opc_item = proto_tree_add_text(label_tree, tvb, ANSI_OPC_OFFSET,
+ ANSI_OPC_LENGTH,
+ "OPC (%d-%d-%d)",
+ (opc & ANSI_NETWORK_MASK),
+ ((opc & ANSI_CLUSTER_MASK) >> 8),
+ ((opc & ANSI_MEMBER_MASK) >> 16));
+
+ label_opc_tree = proto_item_add_subtree(label_opc_item,
+ ett_mtp3_label_opc);
+
+ proto_tree_add_uint(label_opc_tree, hf_mtp3_opc_member,
+ tvb, ANSI_OPC_OFFSET, ANSI_NCM_LENGTH, opc);
+ proto_tree_add_uint(label_opc_tree, hf_mtp3_opc_cluster,
+ tvb, ANSI_OPC_OFFSET, ANSI_NCM_LENGTH, opc);
+ proto_tree_add_uint(label_opc_tree, hf_mtp3_opc_network,
+ tvb, ANSI_OPC_OFFSET, ANSI_NCM_LENGTH,
+ opc);
+ /* SLS */
+ /* TODO: separate 5-bit and 8-bit SLS */
+ proto_tree_add_item(label_tree, hf_mtp3_ansi_sls, tvb, ANSI_SLS_OFFSET,
+ ANSI_SLS_LENGTH, sls);
+ /* proto_tree_add_uint(label_tree, hf_mtp3_ansi_sls, tvb,
+ ANSI_SLS_OFFSET, ANSI_SLS_LENGTH,
+ sls);*/
+ break;
+
+ default:
+ printf("MTP3: unknown standard: %d\n", mtp3_standard);
+ }