/* packet-mpeg-dsmcc.c * * Routines for ISO/IEC 13818-6 DSM-CC * Copyright 2012, Weston Schmidt * Copyright 2019, Anthony Crawford * * Wireshark - Network traffic analyzer * By Gerald Combs * Copyright 1998 Gerald Combs * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "config.h" #include #include #include #include #include "packet-mpeg-sect.h" void proto_register_dsmcc(void); void proto_reg_handoff_dsmcc(void); static dissector_handle_t dsmcc_ts_handle, dsmcc_tcp_handle, dsmcc_udp_handle; /* NOTE: Please try to keep this status comment up to date until the spec is * completely implemented - there are a large number of tables in the spec. * * 13818-6 Table status: * * Missing tables: * 3-1 3-2 3-3 3-4 3-6 3-7 3-8 3-9 * 4-61, 4-81, 4-82, 4-87, 4-88 * 5-* * 6-4 * 7-5 7-8 7-10 7-12 * 8-2 8-3 8-4 8-6 * 9-5 9-6 * 10-* * 11-* * 12-* * * Dissected tables: * 2-1 2-4 2-6 2-7 * 4-x * 6-1 * 7-6 7-7 * 9-2 * J.3 * * Validated (all parameters are checked) U-N Messages: * 0x4010, 0x4011, 0x4020, 0x4021, 0x4022, 0x4023, 0x40b0 * 0x8012, 0x8013, 0x8022, 0x8023, 0x8030, 0x8031, 0x8060, 0x8061, 0x80b0 * Unvalidated U-N messages: * 4032, 4033, 4042, 4043, 4060, 4061, 4062, 4063, * 4070, 4071, 4072, 4073, 4082, 4090, 40a2, 40a3 * 8041, 8042, 8050, 8051, 8062, 8063, 8070, 8071, * 8072, 8073, 8082, 8092, 80a0, 80a1, 80a2, 80a3 * */ static int proto_dsmcc = -1; static gboolean dsmcc_sect_check_crc = FALSE; /* NOTE: Please add values numerically according to 13818-6 so it is easier to * keep track of what parameters/tables are associated with each other. */ /* table 2-1 dsmccMessageHeader - start */ static int hf_dsmcc_protocol_discriminator = -1; static int hf_dsmcc_type = -1; static int hf_dsmcc_message_id = -1; static int hf_dsmcc_transaction_id = -1; static int hf_dsmcc_header_reserved = -1; static int hf_dsmcc_adaptation_length = -1; static int hf_dsmcc_message_length = -1; /* table 2-1 dsmccMessageHeader - end */ /* table 2-3 transactionId - start */ static int hf_dsmcc_un_sess_flag_transaction_id_originator = -1; static int hf_dsmcc_un_sess_flag_transaction_id_number = -1; /* table 2-3 transactionId - end */ /* table 2-4 dsmccAdaptationHeader - start */ static int hf_dsmcc_adaptation_type = -1; /* table 2-4 dsmccAdaptationHeader - end */ /* table 2-6 dsmccConditionalAccess - start */ static int hf_dsmcc_adaptation_ca_reserved = -1; static int hf_dsmcc_adaptation_ca_system_id = -1; static int hf_dsmcc_adaptation_ca_length = -1; /* table 2-6 dsmccConditionalAccess - end */ /* table 2-7 dsmccUserId - start */ static int hf_dsmcc_adaptation_user_id_reserved = -1; /* table 2-7 dsmccUserId - end */ /* table 4-2, 4-3, 4-4 U-N messageDiscriminator - start */ /*static int hf_dsmcc_un_sess_message_discriminator = -1;*/ static int hf_dsmcc_un_sess_flag_message_discriminator = -1; static int hf_dsmcc_un_sess_flag_message_scenario = -1; static int hf_dsmcc_un_sess_flag_message_type = -1; /* table 4-2, 4-3, 4-4 U-N messageDiscriminator - end */ /* other tables in section 4.2 - start */ static int hf_dsmcc_un_sess_response = -1; static int hf_dsmcc_un_sess_reason = -1; static int hf_dsmcc_un_sess_reserved = -1; /* other tables in section 4.2 - end */ /* table 4-6 U-N user data format - start */ static int hf_dsmcc_un_sess_uu_data_len = -1; static int hf_dsmcc_un_sess_uu_data = -1; static int hf_dsmcc_un_sess_priv_data_len = -1; static int hf_dsmcc_un_sess_priv_data = -1; /* table 4-6 U-N user data format - end */ /* table 4-7 U-N Resources - start */ static int hf_dsmcc_un_sess_rsrc_desc_count = -1; /* table 4-7 U-N Resources - end */ /* table 4-10 U-N Server Session Setup Indication - start */ static int hf_dsmcc_un_sess_forward_count = -1; /* table 4-10 U-N Server Session Setup Indication - end */ /* 4-26 Server Delete Resource Request - start */ static int hf_dsmcc_un_sess_resource_count = -1; static int hf_dsmcc_un_sess_resource_num = -1; /* 4-26 Server Delete Resource Request - end */ /* table 4-30, 4-31, 4-32, 4-33, 4-34, 4-35, 4-36 - start */ static int hf_dsmcc_un_sess_status_type = -1; static int hf_dsmcc_un_sess_status_count = -1; static int hf_dsmcc_un_sess_status_byte = -1; /* table 4-30, 4-31, 4-32, 4-33, 4-34, 4-35, 4-36 - end */ /* table 4-56 Client Session In Progress - start */ static int hf_dsmcc_un_sess_session_count = -1; /* table 4-56 Client Session In Progress - end */ /* table 4-58 Message Fields data types - start */ static int hf_dsmcc_un_sess_session_id_device_id = -1; static int hf_dsmcc_un_sess_session_id_session_number = -1; /* table 4-58 Message Fields data types - end */ /* table 4-63 U-N common descriptor header - start */ static int hf_dsmcc_un_sess_rsrc_request_id = -1; static int hf_dsmcc_un_sess_rsrc_descriptor_type = -1; static int hf_dsmcc_un_sess_rsrc_number = -1; static int hf_dsmcc_un_sess_rsrc_association_tag = -1; static int hf_dsmcc_un_sess_rsrc_flags = -1; static int hf_dsmcc_un_sess_rsrc_status = -1; static int hf_dsmcc_un_sess_rsrc_desc_data_fields_length = -1; static int hf_dsmcc_un_sess_rsrc_data_field_count = -1; static int hf_dsmcc_un_sess_rsrc_type_owner_id = -1; static int hf_dsmcc_un_sess_rsrc_type_owner_value = -1; /* table 4-63 U-N common descriptor header - end */ /* table 4-64 U-N resource number assignor - start */ static int hf_dsmcc_un_sess_rsrc_flag_num_assignor = -1; static int hf_dsmcc_un_sess_rsrc_flag_num_value = -1; /* table 4-64 U-N resource number assignor - end */ /* table 4-65 U-N resource association tag assignor - start */ static int hf_dsmcc_un_sess_rsrc_flag_association_tag_assignor = -1; static int hf_dsmcc_un_sess_rsrc_flag_association_tag_value = -1; /* table 4-65 U-N resource association tag assignor - end */ /* table 4-66 U-N resource allocator - start */ static int hf_dsmcc_un_sess_rsrc_flag_allocator = -1; /* table 4-66 U-N resource allocator - end */ /* table 4-67 U-N resource attribute - start */ static int hf_dsmcc_un_sess_rsrc_flag_attribute = -1; /* table 4-67 U-N resource attribute - end */ /* table 4-68 U-N resource view - start */ static int hf_dsmcc_un_sess_rsrc_flag_view = -1; /* table 4-68 U-N resource view - end */ /* table 4-71 U-N dsmccResourceDescriptorValue() format - start */ static int hf_dsmcc_un_sess_rsrc_value_type = -1; static int hf_dsmcc_un_sess_rsrc_value_count = -1; static int hf_dsmcc_un_sess_rsrc_value_data = -1; static int hf_dsmcc_un_sess_rsrc_most_desired = -1; static int hf_dsmcc_un_sess_rsrc_least_desired = -1; /* table 4-71 U-N dsmccResourceDescriptorValue() format - end */ /* table 4-74 U-N Continuous Feed Session resource descriptor - start */ static int hf_dsmcc_un_sess_rsrc_cfs_num_count = -1; static int hf_dsmcc_un_sess_rsrc_cfs_num = -1; /* table 4-74 U-N Continuous Feed Session resource descriptor - end */ /* table 4-75 U-N ATM Connection resource descriptor - start */ static int hf_dsmcc_un_sess_rsrc_atm_vpi = -1; static int hf_dsmcc_un_sess_rsrc_atm_vci = -1; /* table 4-75 U-N ATM Connection resource descriptor - end */ /* table 4-76 MPEG Program - start */ static int hf_dsmcc_un_sess_rsrc_mpeg_ca_pid = -1; static int hf_dsmcc_un_sess_rsrc_mpeg_elem_stream_count = -1; /* table 4-76 MPEG Program - end */ /* table 4-77 Physical Channel - start */ static int hf_dsmcc_un_sess_rsrc_phys_chan_direction = -1; /* table 4-77 Physical Channel - end */ /* table 4-84 IP - start */ static int hf_dsmcc_un_sess_rsrc_src_ip_addr = -1; static int hf_dsmcc_un_sess_rsrc_src_ip_port = -1; static int hf_dsmcc_un_sess_rsrc_dst_ip_addr = -1; static int hf_dsmcc_un_sess_rsrc_dst_ip_port = -1; static int hf_dsmcc_un_sess_rsrc_ip_protocol = -1; /* table 4-84 IP - end */ /* table 4-86 PSTN Setup - start */ static int hf_dsmcc_un_sess_rsrc_pstn_calling_id = -1; static int hf_dsmcc_un_sess_rsrc_pstn_called_id = -1; /* table 4-86 PSTN Setup - end */ /* Table 4-89 Q.922 Connection - start */ static int hf_dsmcc_un_sess_rsrc_dlci_count = -1; static int hf_dsmcc_un_sess_rsrc_dlci = -1; static int hf_dsmcc_un_sess_rsrc_dl_association_tag = -1; /* Table 4-89 Q.922 Connection - end */ /* table 4-90 Shared Resource - start */ static int hf_dsmcc_un_sess_rsrc_shared_resource_num = -1; /* table 4-90 Shared Resource - end */ /* table 4-91 Shared Request ID - start */ static int hf_dsmcc_un_sess_rsrc_shared_resource_request_id = -1; /* table 4-91 Shared Request ID - end */ /* table 4-92 Headend List - start */ static int hf_dsmcc_un_sess_rsrc_headend_count = -1; static int hf_dsmcc_un_sess_rsrc_headend_code = -1; /* table 4-92 Headend List - end */ /* table 4-94 SDB Continuous Feed - start */ static int hf_dsmcc_un_sess_rsrc_sdb_id = -1; static int hf_dsmcc_un_sess_rsrc_sdb_program_count = -1; static int hf_dsmcc_un_sess_rsrc_sdb_association_tag = -1; static int hf_dsmcc_un_sess_rsrc_sdb_broadcast_program_id = -1; /* table 4-94 SDB Continuous Feed - end */ /* table 4-95 SDB Associations - start */ static int hf_dsmcc_un_sess_rsrc_sdb_control_association_tag = -1; static int hf_dsmcc_un_sess_rsrc_sdb_program_association_tag = -1; /* table 4-95 SDB Associations - end */ /* table 4-96 SDB Entitlement - start */ static int hf_dsmcc_un_sess_rsrc_sdb_exclude_count = -1; static int hf_dsmcc_un_sess_rsrc_sdb_include_count = -1; /* table 4-96 SDB Entitlement - end */ /* user defined 0xf001-0xf007 - start */ /* Time Warner Cable Pegasus Session Setup Protocol * Version 2.3, May 19 2003 * These user defined resource descriptors have been implemented in * VOD BackOffice products by Time Warner, Arris and Ericsson. */ static int hf_dsmcc_un_sess_rsrc_trans_system = -1; static int hf_dsmcc_un_sess_rsrc_inner_coding = -1; static int hf_dsmcc_un_sess_rsrc_split_bitstream = -1; static int hf_dsmcc_un_sess_rsrc_mod_format = -1; static int hf_dsmcc_un_sess_rsrc_symbol_rate = -1; static int hf_dsmcc_un_sess_rsrc_reserved = -1; static int hf_dsmcc_un_sess_rsrc_interleave_depth = -1; static int hf_dsmcc_un_sess_rsrc_modulation_mode = -1; static int hf_dsmcc_un_sess_rsrc_fec = -1; static int hf_dsmcc_un_sess_rsrc_headend_flag = -1; static int hf_dsmcc_un_sess_rsrc_headend_tsid = -1; static int hf_dsmcc_un_sess_rsrc_server_ca_copyprotect = -1; static int hf_dsmcc_un_sess_rsrc_server_ca_usercount = -1; static int hf_dsmcc_un_sess_rsrc_client_ca_info_length = -1; static int hf_dsmcc_un_sess_rsrc_client_ca_info_data = -1; static int hf_dsmcc_un_sess_rsrc_service_group = -1; /* user defined 0xf001-0xf007 - end */ /* table 6-1 compatabilityDescriptor - start */ static int hf_compat_desc_length = -1; static int hf_compat_desc_count = -1; static int hf_desc_type = -1; static int hf_desc_length = -1; static int hf_desc_spec_type = -1; static int hf_desc_spec_data = -1; static int hf_desc_model = -1; static int hf_desc_version = -1; static int hf_desc_sub_desc_count = -1; static int hf_desc_sub_desc_type = -1; static int hf_desc_sub_desc_len = -1; /* table 6-1 compatabilityDescriptor - end */ /* table 7-3 dsmccDownloadDataHeader - start */ static int hf_dsmcc_dd_download_id = -1; static int hf_dsmcc_dd_message_id = -1; /* table 7-3 dsmccDownloadDataHeader - end */ /* table 7-6 dsmccDownloadInfoIndication/InfoResponse - start */ static int hf_dsmcc_dii_download_id = -1; static int hf_dsmcc_dii_block_size = -1; static int hf_dsmcc_dii_window_size = -1; static int hf_dsmcc_dii_ack_period = -1; static int hf_dsmcc_dii_t_c_download_window = -1; static int hf_dsmcc_dii_t_c_download_scenario = -1; static int hf_dsmcc_dii_number_of_modules = -1; static int hf_dsmcc_dii_module_id = -1; static int hf_dsmcc_dii_module_size = -1; static int hf_dsmcc_dii_module_version = -1; static int hf_dsmcc_dii_module_info_length = -1; static int hf_dsmcc_dii_private_data_length = -1; /* table 7-6 dsmccDownloadInfoIndication/InfoResponse - end */ /* table 7-7 dsmccDownloadDataBlock - start */ static int hf_dsmcc_ddb_module_id = -1; static int hf_dsmcc_ddb_version = -1; static int hf_dsmcc_ddb_reserved = -1; static int hf_dsmcc_ddb_block_number = -1; /* table 7-7 dsmccDownloadDataBlock - end */ /* table 9-2 dsmccSection - start */ static int hf_dsmcc_table_id = -1; static int hf_dsmcc_section_syntax_indicator = -1; static int hf_dsmcc_private_indicator = -1; static int hf_dsmcc_reserved = -1; static int hf_dsmcc_section_length = -1; static int hf_dsmcc_table_id_extension = -1; static int hf_dsmcc_reserved2 = -1; static int hf_dsmcc_version_number = -1; static int hf_dsmcc_current_next_indicator = -1; static int hf_dsmcc_section_number = -1; static int hf_dsmcc_last_section_number = -1; static int hf_dsmcc_crc = -1; static int hf_dsmcc_checksum = -1; /* table 9-2 dsmccSection - end */ /* table J.3 E-164 NSAP - start */ static int hf_dsmcc_un_sess_nsap_afi = -1; static int hf_dsmcc_un_sess_nsap_idi = -1; static int hf_dsmcc_un_sess_nsap_ho_dsp = -1; static int hf_dsmcc_un_sess_nsap_esi = -1; static int hf_dsmcc_un_sess_nsap_sel = -1; /* table J.3 E-164 NSAP - end */ /* TODO: this should really live in the ETV dissector, but I'm not sure how * to make the functionality work exactly right yet. Will work on a patch * for this next. */ static int hf_etv_module_abs_path = -1; static int hf_etv_dii_authority = -1; static gint ett_dsmcc = -1; static gint ett_dsmcc_payload = -1; static gint ett_dsmcc_header = -1; static gint ett_dsmcc_adaptation_header = -1; static gint ett_dsmcc_message_id = -1; static gint ett_dsmcc_transaction_id = -1; static gint ett_dsmcc_heading = -1; static gint ett_dsmcc_rsrc_number = -1; static gint ett_dsmcc_rsrc_association_tag = -1; static gint ett_dsmcc_rsrc_flags = -1; static gint ett_dsmcc_compat = -1; static gint ett_dsmcc_compat_sub_desc = -1; static gint ett_dsmcc_dii_module = -1; static expert_field ei_dsmcc_invalid_value = EI_INIT; static expert_field ei_dsmcc_crc_invalid = EI_INIT; #define DSMCC_TCP_PORT 13819 #define DSMCC_UDP_PORT 13819 /* DSM-CC protocol discriminator, (table 2-1) */ #define DSMCC_PROT_DISC 0x11 #define DSMCC_SSI_MASK 0x8000 #define DSMCC_PRIVATE_MASK 0x4000 #define DSMCC_RESERVED_MASK 0x3000 #define DSMCC_LENGTH_MASK 0x0fff #define DSMCC_RESERVED2_MASK 0xc0 #define DSMCC_VERSION_NUMBER_MASK 0x3e #define DSMCC_CURRENT_NEXT_INDICATOR_MASK 0x01 /* DSM-CC U-N Session Flags */ #define DMSCC_FLAG_MESS_DISCRIMINATOR 0xc000 #define DMSCC_FLAG_MESS_SCENARIO 0x3ff0 #define DMSCC_FLAG_MESS_TYPE 0x000f #define DMSCC_FLAG_TRAN_ORIG 0xc0000000 #define DMSCC_FLAG_TRAN_NUM 0x3fffffff #define DMSCC_FLAG_RSRC_NUM_ASSIGNOR 0xc000 #define DMSCC_FLAG_RSRC_NUM_VALUE 0x3fff #define DMSCC_FLAG_RSRC_ASSOC_TAG_ASSIGNOR 0xc000 #define DMSCC_FLAG_RSRC_ASSOC_TAG_VALUE 0x3fff #define DMSCC_FLAG_RSRC_VIEW 0xc0 #define DMSCC_FLAG_RSRC_ATTRIBUTE 0x3c #define DMSCC_FLAG_RSRC_ALLOCATOR 0x03 /* DSM-CC protocol U-N messages, (table 4-5) */ /* 4-5 U-N Session Client Messages */ #define DSMCC_UN_SESS_CLN_SESS_SET_REQ 0x4010 #define DSMCC_UN_SESS_CLN_SESS_SET_CNF 0x4011 #define DSMCC_UN_SESS_CLN_SESS_REL_REQ 0x4020 #define DSMCC_UN_SESS_CLN_SESS_REL_CNF 0x4021 #define DSMCC_UN_SESS_CLN_SESS_REL_IND 0x4022 #define DSMCC_UN_SESS_CLN_SESS_REL_RES 0x4023 #define DSMCC_UN_SESS_CLN_ADD_RSRC_IND 0x4032 #define DSMCC_UN_SESS_CLN_ADD_RSRC_RES 0x4033 #define DSMCC_UN_SESS_CLN_DEL_RSRC_IND 0x4042 #define DSMCC_UN_SESS_CLN_DEL_RSRC_RES 0x4043 #define DSMCC_UN_SESS_CLN_STATUS_REQ 0x4060 #define DSMCC_UN_SESS_CLN_STATUS_CNF 0x4061 #define DSMCC_UN_SESS_CLN_STATUS_IND 0x4062 #define DSMCC_UN_SESS_CLN_STATUS_RES 0x4063 #define DSMCC_UN_SESS_CLN_RESET_REQ 0x4070 #define DSMCC_UN_SESS_CLN_RESET_CNF 0x4071 #define DSMCC_UN_SESS_CLN_RESET_IND 0x4072 #define DSMCC_UN_SESS_CLN_RESET_RES 0x4073 #define DSMCC_UN_SESS_CLN_SESS_PROC_IND 0x4082 #define DSMCC_UN_SESS_CLN_CONN_REQ 0x4090 #define DSMCC_UN_SESS_CLN_SESS_TRN_IND 0x40a2 #define DSMCC_UN_SESS_CLN_SESS_TRN_RES 0x40a3 #define DSMCC_UN_SESS_CLN_SESS_INP_REQ 0x40b0 /* 4-5 U-N Session Server Messages */ #define DSMCC_UN_SESS_SRV_SESS_SET_IND 0x8012 #define DSMCC_UN_SESS_SRV_SESS_SET_RES 0x8013 #define DSMCC_UN_SESS_SRV_SESS_REL_REQ 0x8020 #define DSMCC_UN_SESS_SRV_SESS_REL_CNF 0x8021 #define DSMCC_UN_SESS_SRV_SESS_REL_IND 0x8022 #define DSMCC_UN_SESS_SRV_SESS_REL_RES 0x8023 #define DSMCC_UN_SESS_SRV_ADD_RSRC_REQ 0x8030 #define DSMCC_UN_SESS_SRV_ADD_RSRC_CNF 0x8031 #define DSMCC_UN_SESS_SRV_DEL_RSRC_REQ 0x8040 #define DSMCC_UN_SESS_SRV_DEL_RSRC_CNF 0x8041 #define DSMCC_UN_SESS_SRV_CONT_FEED_SESS_REQ 0x8050 #define DSMCC_UN_SESS_SRV_CONT_FEED_SESS_CNF 0x8051 #define DSMCC_UN_SESS_SRV_STATUS_REQ 0x8060 #define DSMCC_UN_SESS_SRV_STATUS_CNF 0x8061 #define DSMCC_UN_SESS_SRV_STATUS_IND 0x8062 #define DSMCC_UN_SESS_SRV_STATUS_RES 0x8063 #define DSMCC_UN_SESS_SRV_RESET_REQ 0x8070 #define DSMCC_UN_SESS_SRV_RESET_CNF 0x8071 #define DSMCC_UN_SESS_SRV_RESET_IND 0x8072 #define DSMCC_UN_SESS_SRV_RESET_RES 0x8073 #define DSMCC_UN_SESS_SRV_SESS_PROC_IND 0x8082 #define DSMCC_UN_SESS_SRV_CONN_IND 0x8092 #define DSMCC_UN_SESS_SRV_SESS_TRN_REQ 0x80a0 #define DSMCC_UN_SESS_SRV_SESS_TRN_CNF 0x80a1 #define DSMCC_UN_SESS_SRV_SESS_TRN_IND 0x80a2 #define DSMCC_UN_SESS_SRV_SESS_TRN_RES 0x80a3 #define DSMCC_UN_SESS_SRV_SESS_INP_REQ 0x80b0 /* 4-73 U-N Session Resource Descriptors */ #define RSRC_CONT_FEED_SESS 0x0001 #define RSRC_ATM_CONN 0x0002 #define RSRC_MPEG_PROG 0x0003 #define RSRC_PHYS_CHAN 0x0004 #define RSRC_TS_US_BW 0x0005 #define RSRC_TS_DS_BW 0x0006 #define RSRC_ATM_SVC_CONN 0x0007 #define RSRC_CONN_NTFY 0x0008 #define RSRC_IP 0x0009 #define RSRC_CLN_TDMA_ASSIGN 0x000a #define RSRC_PSTN_SETUP 0x000b #define RSRC_NISDN_SETUP 0x000c #define RSRC_NISDN_CONN 0x000d #define RSRC_Q922_CONN 0x000e #define RSRC_HEADEND_LIST 0x000f #define RSRC_ATM_VC_CONN 0x0010 #define RSRC_SDB_CONT_FEED 0x0011 #define RSRC_SDB_ASSOC 0x0012 #define RSRC_SDB_ENT 0x0013 #define RSRC_SHARED_RSRC 0x7ffe #define RSRC_SHARED_REQ_ID 0x7fff #define RSRC_TYPE_OWNER 0xffff /* U-N Session User Defined Resource Descriptors */ #define RSRC_MODULATION_MODE 0xf001 #define RSRC_HEADEND_ID 0xf003 #define RSRC_SERVER_CA 0xf004 #define RSRC_CLIENT_CA 0xf005 #define RSRC_ETHERNET 0xf006 #define RSRC_SERVICE_GROUP 0xf007 /* 2-2 */ static const range_string dsmcc_header_type_vals[] = { { 0, 0, "ISO/IEC 13818-6 Reserved" }, { 0x01, 0x01, "ISO/IEC 13818-6 User-to-Network Configuration Message" }, { 0x02, 0x02, "ISO/IEC 13818-6 User-to-Network Session Message" }, { 0x03, 0x03, "ISO/IEC 13818-6 Download Message" }, { 0x04, 0x04, "ISO/IEC 13818-6 SDB Channel Change Protocol Message" }, { 0x05, 0x05, "ISO/IEC 13818-6 User-to-Network Pass-Thru Message" }, { 0x06, 0x7f, "ISO/IEC 13818-6 Reserved" }, { 0x80, 0xff, "User Defined Message Type" }, { 0, 0, NULL } }; /* 2-3 */ static const range_string dsmcc_un_sess_transaction_id_originator_vals[] = { { 0, 0, "Assigned by Client" }, { 0x01, 0x01, "Assigned by Server" }, { 0x02, 0x02, "Assigned by Network" }, { 0x03, 0x03, "ISO/IEC 13818-6 Reserved" }, { 0x04, 0xff, "Invalid"}, { 0, 0, NULL } }; /* 2-5 */ static const range_string dsmcc_adaptation_header_vals[] = { { 0, 0, "ISO/IEC 13818-6 Reserved" }, { 0x01, 0x01, "DSM-CC Conditional Access Adaptation Format" }, { 0x02, 0x02, "DSM-CC User ID Adaptation Format" }, { 0x03, 0x7f, "ISO/IEC 13818-6 Reserved" }, { 0x80, 0xff, "User Defined Adaptation Type" }, { 0, 0, NULL } }; /* 4-2 */ static const range_string dsmcc_un_sess_message_discriminator_vals[] = { { 0, 0, "ISO/IEC 13818-6 Reserved" }, { 0x01, 0x01, "Client and Network" }, { 0x02, 0x02, "Server and Network" }, { 0x03, 0x0f, "ISO/IEC 13818-6 Reserved" }, { 0x10, 0xff, "Invalid"}, { 0, 0, NULL } }; /* 4-3 */ static const range_string dsmcc_un_sess_message_scenario_vals[] = { { 0, 0, "ISO/IEC 13818-6 Reserved" }, { 0x0001, 0x0001, "Session Setup" }, { 0x0002, 0x0002, "Session Release" }, { 0x0003, 0x0003, "Add Resource" }, { 0x0004, 0x0004, "Delete Resource" }, { 0x0005, 0x0005, "Continuous Feed Session Setup" }, { 0x0006, 0x0006, "Status" }, { 0x0007, 0x0007, "Reset" }, { 0x0008, 0x0008, "Session Proceeding" }, { 0x0009, 0x0009, "Session Connect" }, { 0x000a, 0x000a, "Session Transfer" }, { 0x000b, 0x000b, "Session In Progress" }, { 0x000c, 0x01ff, "ISO/IEC 13818-6 Reserved" }, { 0x0200, 0x03ff, "User Defined Message Scenario" }, { 0x0400, 0xffff, "Invalid"}, { 0, 0, NULL } }; /* 4-4 */ static const range_string dsmcc_un_sess_message_type_vals[] = { { 0, 0, "Request Message" }, { 0x01, 0x01, "Confirm Message" }, { 0x02, 0x02, "Indication Message" }, { 0x03, 0x03, "Response Message" }, { 0x04, 0x0f, "ISO/IEC 13818-6 Reserved" }, { 0x10, 0xff, "Invalid"}, { 0, 0, NULL } }; /* 4-5 */ static const value_string dsmcc_un_sess_message_id_vals[] = { { DSMCC_UN_SESS_CLN_SESS_SET_REQ, "Client Session Setup Request" }, { DSMCC_UN_SESS_CLN_SESS_SET_CNF, "Client Session Setup Confirm" }, { DSMCC_UN_SESS_CLN_SESS_REL_REQ, "Client Session Release Request" }, { DSMCC_UN_SESS_CLN_SESS_REL_CNF, "Client Session Release Confirm" }, { DSMCC_UN_SESS_CLN_SESS_REL_IND, "Client Session Release Indication" }, { DSMCC_UN_SESS_CLN_SESS_REL_RES, "Client Session Release Response" }, { DSMCC_UN_SESS_CLN_ADD_RSRC_IND, "Client Add Resource Indication" }, { DSMCC_UN_SESS_CLN_ADD_RSRC_RES, "Client Add Resource Response" }, { DSMCC_UN_SESS_CLN_DEL_RSRC_IND, "Client Delete Resource Indication" }, { DSMCC_UN_SESS_CLN_DEL_RSRC_RES, "Client Delete Resource Response" }, { DSMCC_UN_SESS_CLN_STATUS_REQ, "Client Status Request" }, { DSMCC_UN_SESS_CLN_STATUS_CNF, "Client Status Confirm" }, { DSMCC_UN_SESS_CLN_STATUS_IND, "Client Status Indication" }, { DSMCC_UN_SESS_CLN_STATUS_RES, "Client Status Response" }, { DSMCC_UN_SESS_CLN_RESET_REQ, "Client Reset Request" }, { DSMCC_UN_SESS_CLN_RESET_CNF, "Client Reset Confirm" }, { DSMCC_UN_SESS_CLN_RESET_IND, "Client Reset Indication" }, { DSMCC_UN_SESS_CLN_RESET_RES, "Client Reset Response" }, { DSMCC_UN_SESS_CLN_SESS_PROC_IND, "Client Session Proceeding Indication" }, { DSMCC_UN_SESS_CLN_CONN_REQ, "Client Connect Request" }, { DSMCC_UN_SESS_CLN_SESS_TRN_IND, "Client Session Transfer Indication" }, { DSMCC_UN_SESS_CLN_SESS_TRN_RES, "Client Session Transfer Response" }, { DSMCC_UN_SESS_CLN_SESS_INP_REQ, "Client Session In Progress Request" }, { DSMCC_UN_SESS_SRV_SESS_SET_IND, "Server Session Setup Indication" }, { DSMCC_UN_SESS_SRV_SESS_SET_RES, "Server Session Setup Response" }, { DSMCC_UN_SESS_SRV_SESS_REL_REQ, "Server Session Release Request" }, { DSMCC_UN_SESS_SRV_SESS_REL_CNF, "Server Session Release Confirm" }, { DSMCC_UN_SESS_SRV_SESS_REL_IND, "Server Session Release Indication" }, { DSMCC_UN_SESS_SRV_SESS_REL_RES, "Server Session Release Response" }, { DSMCC_UN_SESS_SRV_ADD_RSRC_REQ, "Server Add Resource Request" }, { DSMCC_UN_SESS_SRV_ADD_RSRC_CNF, "Server Add Resource Confirm" }, { DSMCC_UN_SESS_SRV_DEL_RSRC_REQ, "Server Delete Resource Request" }, { DSMCC_UN_SESS_SRV_DEL_RSRC_CNF, "Server Delete Resource Confirm" }, { DSMCC_UN_SESS_SRV_CONT_FEED_SESS_REQ, "Server Continuous Feed Session Request" }, { DSMCC_UN_SESS_SRV_CONT_FEED_SESS_CNF, "Server Continuous Feed Session Confirm" }, { DSMCC_UN_SESS_SRV_STATUS_REQ, "Server Status Request" }, { DSMCC_UN_SESS_SRV_STATUS_CNF, "Server Status Confirm" }, { DSMCC_UN_SESS_SRV_STATUS_IND, "Server Status Indication" }, { DSMCC_UN_SESS_SRV_STATUS_RES, "Server Status Response" }, { DSMCC_UN_SESS_SRV_RESET_REQ, "Server Reset Request" }, { DSMCC_UN_SESS_SRV_RESET_CNF, "Server Reset Confirm" }, { DSMCC_UN_SESS_SRV_RESET_IND, "Server Reset Indication" }, { DSMCC_UN_SESS_SRV_RESET_RES, "Server Reset Response" }, { DSMCC_UN_SESS_SRV_SESS_PROC_IND, "Server Session Proceeding Indication" }, { DSMCC_UN_SESS_SRV_CONN_IND, "Server Connect Indication" }, { DSMCC_UN_SESS_SRV_SESS_TRN_REQ, "Server Session Transfer Request" }, { DSMCC_UN_SESS_SRV_SESS_TRN_CNF, "Server Session Transfer Confirm" }, { DSMCC_UN_SESS_SRV_SESS_TRN_IND, "Server Session Transfer Indication" }, { DSMCC_UN_SESS_SRV_SESS_TRN_RES, "Server Session Transfer Response" }, { DSMCC_UN_SESS_SRV_SESS_INP_REQ, "Server Session In Progress Request" }, { 0, NULL } }; /* 4-59 */ static const range_string dsmcc_un_sess_message_reason_codes_vals[] = { { 0, 0, "RsnOK. The command sequence is proceeding normally." }, { 0x0001, 0x0001, "RsnNormal. Normal conditions for releasing the session." }, { 0x0002, 0x0002, "RsnClProcError. Procedure error detected at the Client." }, { 0x0003, 0x0003, "RsnNeProcError. Procedure error detected at the Network." }, { 0x0004, 0x0004, "RsnSeProcError. Procedure error detected at the Server." }, { 0x0005, 0x0005, "RsnClFormatError. Invalid format (e.g., missing parameter) detected at the Client." }, { 0x0006, 0x0006, "RsnNeFormatError. Invalid format (e.g., missing parameter) detected at the Network." }, { 0x0007, 0x0007, "RsnSeFormatError. Invalid format (e.g., missing parameter) detected at the Server." }, { 0x0008, 0x0008, "RsnNeConfigCnf. Confirmed configuration sequence (i.e., Client must respond)" }, { 0x0009, 0x0009, "RsnSeTranRefuse. Session transfer was refused by the destination Server." }, { 0x000a, 0x000a, "RsnSeForwardOvl. Session forwarding is due to overload conditions." }, { 0x000b, 0x000b, "RsnSeForwardMnt. Session forwarding is due to overload maintenance conditions." }, { 0x000c, 0x000c, "RsnSeForwardUncond. Session forwarding is sent as an unconditional request." }, { 0x000d, 0x000d, "RsnSeRejResource. Server rejected the assigned resources." }, { 0x000e, 0x000e, "RsnNeBroadcast. Message is being broadcast and does not require a response." }, { 0x000f, 0x000f, "RsnSeServiceTransfer. Server indicates that the Client shall establish a session to another serverId based on the context provided in the PrivateData()." }, { 0x0010, 0x0010, "RsnClNoSession. Client indicates the Session ID is not active." }, { 0x0011, 0x0011, "RsnSeNoSession. Server indicates the Session ID is not active." }, { 0x0012, 0x0012, "RsnNeNoSession. Network indicates the Session ID is not active." }, { 0x0013, 0x0013, "RsnRetrans. Message is a retransmission." }, { 0x0014, 0x0014, "RsnNoTransaction. Message was received without a Transaction ID." }, { 0x0015, 0x0015, "RsnClNoResource. Requested resource is not supported." }, { 0x0016, 0x0016, "RsnClRejResource. Client rejected the assigned resources." }, { 0x0017, 0x0017, "RsnNeRejResource. Network rejected the assigned resources assigned by the Server." }, { 0x0018, 0x0018, "RsnNeTimerExpired. The message is being sent as the result of an expired timer." }, { 0x0019, 0x0019, "RsnClSessionRelease. Client initiated session release." }, { 0x001a, 0x001a, "RsnSeSessionRelease. Server initiated session release." }, { 0x001b, 0x001b, "RsnNeSessionRelease. Network initiated session release." }, { 0x001c, 0x7fff, "Reserved" }, { 0x7fff, 0xffff, "User Defined Reason Code" }, { 0, 0, NULL } }; /* 4-60 */ static const range_string dsmcc_un_sess_message_response_codes_vals[] = { { 0, 0, "RspOK. Request completed with no errors." }, { 0x0001, 0x0001, "RspClNoSession. Client rejected the request because the requested Session ID is invalid." }, { 0x0002, 0x0002, "RspNeNoCalls. Network is unable to accept new sessions." }, { 0x0003, 0x0003, "RspNeInvalidClient. Network rejected the request due to an invalid Client ID." }, { 0x0004, 0x0004, "RspNeInvalidServer. Network rejected the request due to an invalid Server ID." }, { 0x0005, 0x0005, "RspNeNoSession. Network rejected the request because the requested Session ID is invalid." }, { 0x0006, 0x0006, "RspSeNoCalls. Server is unable to accept new sessions." }, { 0x0007, 0x0007, "RspSeInvalidClient. Server rejected the request due to an invalid Client ID." }, { 0x0008, 0x0008, "RspSeNoService. Server rejected the request because the requested service could not be provided." }, { 0x0009, 0x0009, "RspSeNoCFS. Server rejected the request because the requested Continuous Feed Session could not be found." }, { 0x000a, 0x000a, "RspClNoResponse. Network timed out before the Client responded to an Indication message." }, { 0x000b, 0x000b, "RspSeNoResponse. Network timed out before the Server responded to an Indication message." }, { 0x000c, 0x000f, "ISO/IEC 13818-6 reserved." }, { 0x0010, 0x0010, "RspSeNoSession. Server rejected the request because the requested Session ID is invalid." }, { 0x0011, 0x0011, "RspNeResourceContinue. Resource request completed with no errors but, an indicated resource was assigned an alternate value by the Network." }, { 0x0012, 0x0012, "RspNeResourceFailed. Resource request failed because the Network was unable to assign the requested resources." }, { 0x0013, 0x0013, "RspNeResourceOK. Requested command completed with no errors." }, { 0x0014, 0x0014, "RspResourceNegotiate. Network was able to complete a request but has assigned alternate values to a negotiable field." }, { 0x0015, 0x0015, "RspClSessProceed. Network is waiting on a response from the server." }, { 0x0016, 0x0016, "RspClUnkRequestID. Client received a message which contained an unknown Resource Request ID." }, { 0x0017, 0x0017, "RspClNoResource. Client rejected a session set-up because it was unable to use the assigned resources." }, { 0x0018, 0x0018, "RspClNoCalls. Client rejected a session set-up because it was not accepting calls at that time." }, { 0x0019, 0x0019, "RspNeNoResource. Network is unable to assign one or more resources to a session." }, { 0x001a, 0x001f, "ISO/IEC 13818-6 reserved." }, { 0x0020, 0x0020, "RspSeNoResource. Server is unable to complete a session set-up because the required resources are not available." }, { 0x0021, 0x0021, "RspSeRejResource. Server rejected the assigned resources." }, { 0x0022, 0x0022, "RspClProcError. Procedure error detected at the Client." }, { 0x0023, 0x0023, "RspNeProcError. Procedure error detected at the Network." }, { 0x0024, 0x0024, "RspSeProcError. Procedure error detected at the Server." }, { 0x0025, 0x0025, "RspClFormatError. Invalid format (e.g., missing parameter) detected at Client." }, { 0x0026, 0x0026, "RspNeFormatError. Invalid format (e.g., missing parameter) detected at Network." }, { 0x0027, 0x0027, "RspSeFormatError. Invalid format (e.g., missing parameter) detected at Server." }, { 0x0028, 0x0028, "RspSeForwardOvl. Session forwarding is due to overload conditions." }, { 0x0029, 0x0029, "RspSeForwardMnt. Session forwarding is due to overload maintenance conditions." }, { 0x002a, 0x002a, "RspClRejResource. Client rejected a resource assigned to a session." }, { 0x002b, 0x002f, "ISO/IEC 13818-6 reserved." }, { 0x0030, 0x0030, "RspSeForwardUncond. Session forwarding is sent as an unconditional request." }, { 0x0031, 0x0031, "RspNeTransferFailed. Session transfer failed at the Network." }, { 0x0032, 0x0032, "RspClTransferReject. Session transfer was rejected by the Client." }, { 0x0033, 0x0033, "RspSeTransferReject. Session transfer was rejected by the Server." }, { 0x0034, 0x0034, "RspSeTransferResource. Server rejected the session transfer due to insufficient resource." }, { 0x0035, 0x0035, "RspResourceCompleted. Server has accepted the resources assigned by the Network." }, { 0x0036, 0x0036, "RspForward. Server is requesting a Session Forward." }, { 0x0037, 0x0037, "RspNeForwardFailed. Network is unable to process a Session Forward." }, { 0x0038, 0x0038, "RspClForwarded. Session was forwarded to the indicated Client ID." }, { 0x0039, 0x0040, "ISO/IEC 13818-6 reserved." }, { 0x0041, 0x0041, "RspSeTransferNoRes. The transfer to Server could not get enough resources, so it rejected the transfer." }, { 0x0042, 0x0042, "RspNeNotOwner. An action was requested on a session by a User which was not the owner of that session." }, { 0x0043, 0x7fff, "ISO/IEC 13818-6 reserved." }, { 0x8000, 0xffff, "User Defined Response Code" }, { 0, 0, NULL } }; /* 4-61 */ static const range_string dsmcc_un_sess_status_type_vals[] = { { 0, 0, "Reserved" }, { 0x0001, 0x0001, "Identify Session List" }, { 0x0002, 0x0002, "Identify Session Status" }, { 0x0003, 0x0003, "Identify Configuration" }, { 0x0004, 0x0004, "Query Resource Descriptor" }, { 0x0005, 0x0005, "Query Resource Status" }, { 0x0006, 0x7fff, "Reserved" }, { 0x8000, 0xffff, "User Defined Status Type" }, { 0, 0, NULL } }; /* 4-64 */ static const range_string dsmcc_un_sess_rsrc_number_assignor_vals[] = { { 0, 0, "Reserved" }, { 0x01, 0x01, "Client" }, { 0x02, 0x02, "Server" }, { 0x03, 0x03, "Network" }, { 0x04, 0xff, "Reserved" }, { 0, 0, NULL } }; /* 4-65 */ static const range_string dsmcc_un_sess_rsrc_association_tag_vals[] = { { 0, 0, "Reserved" }, { 0x01, 0x01, "Client" }, { 0x02, 0x02, "Server" }, { 0x03, 0x03, "Network" }, { 0x04, 0xff, "Reserved" }, { 0, 0, NULL } }; /* 4-66 */ static const range_string dsmcc_un_sess_rsrc_allocator_vals[] = { { 0, 0, "Unspecified" }, { 0x01, 0x01, "Client" }, { 0x02, 0x02, "Server" }, { 0x03, 0x03, "Network" }, { 0x04, 0xff, "Reserved" }, { 0, 0, NULL } }; /* 4-67 */ static const range_string dsmcc_un_sess_rsrc_attribute_vals[] = { { 0, 0, "Mandatory Non-Negotiable" }, { 0x01, 0x01, "Mandatory Negotiable" }, { 0x02, 0x02, "Non-Mandatory Non-Negotiable" }, { 0x03, 0x03, "Non-Mandatory Negotiable" }, { 0x04, 0x0f, "Reserved"}, { 0x10, 0xff, "Invalid"}, { 0, 0, NULL } }; /* 4-68 */ static const range_string dsmcc_un_sess_rsrc_view_vals[] = { { 0, 0, "Reserved" }, { 0x01, 0x01, "Client View" }, { 0x02, 0x02, "Server View" }, { 0x03, 0x03, "Reserved" }, { 0x04, 0xff, "Invalid" }, { 0, 0, NULL } }; /* 4-69 */ static const range_string dsmcc_un_sess_rsrc_status_vals[] = { { 0, 0, "Reserved" }, { 0x01, 0x01, "Requested" }, { 0x02, 0x02, "In Progress" }, { 0x03, 0x03, "Alternate Assigned" }, { 0x04, 0x04, "Assigned"}, { 0x05, 0x05, "Failed"}, { 0x06, 0x06, "Unprocessed"}, { 0x07, 0x07, "Invalid"}, { 0x08, 0x08, "Released"}, { 0x09, 0x7f, "Reserved"}, { 0x80, 0xff, "User Defined"}, { 0, 0, NULL } }; /* 4-72 */ static const range_string dsmcc_un_sess_rsrc_value_types_vals[] = { { 0, 0, "Reserved" }, { 0x0001, 0x0001, "Single" }, { 0x0002, 0x0002, "List" }, { 0x0003, 0x0003, "Range" }, { 0x0004, 0x7fff, "Reserved"}, { 0x8000, 0xffff, "User Defined"}, { 0, 0, NULL } }; /* 4-73 */ static const range_string dsmcc_un_sess_rsrc_descriptor_type_vals[] = { { 0, 0, "Reserved" }, { 0x0001, 0x0001, "Continuous Feed Session" }, { 0x0002, 0x0002, "ATM Connection" }, { 0x0003, 0x0003, "MPEG Program" }, { 0x0004, 0x0004, "Physical Channel" }, { 0x0005, 0x0005, "TS Upstream Bandwidth" }, { 0x0006, 0x0006, "TS Downstream Bandwidth" }, { 0x0007, 0x0007, "ATM SVC Connection" }, { 0x0008, 0x0008, "Connection Notify" }, { 0x0009, 0x0009, "IP" }, { 0x000a, 0x000a, "Client TDMA Assignment" }, { 0x000b, 0x000b, "PSTN Setup" }, { 0x000c, 0x000c, "NISDN Setup" }, { 0x000d, 0x000d, "NISDN Connection" }, { 0x000e, 0x000e, "Q.922 Connections" }, { 0x000f, 0x000f, "Headend List" }, { 0x0010, 0x0010, "ATM VC Connection" }, { 0x0011, 0x0011, "SDB Continuous Feed" }, { 0x0012, 0x0012, "SDB Associations" }, { 0x0013, 0x0013, "SDB Entitlement" }, { 0x0014, 0x7ffd, "Reserved" }, { 0x7ffe, 0x7ffe, "Shared Resource" }, { 0x7fff, 0x7fff, "Shared Request ID" }, { 0x8000, 0xf000, "User Defined" }, { 0xf001, 0xf001, "Modulation Mode" }, { 0xf002, 0xf002, "User Defined" }, { 0xf003, 0xf003, "Headend ID" }, { 0xf004, 0xf004, "Server Conditional Access" }, { 0xf005, 0xf005, "Client Conditional Access" }, { 0xf006, 0xf006, "Ethernet Interface" }, { 0xf007, 0xf007, "Service Group" }, { 0xf008, 0xfffe, "User Defined" }, { 0xffff, 0xffff, "User Defined Type Owner" }, { 0, 0, NULL } }; /* table 4-78 direction values */ static const range_string dsmcc_un_sess_rsrc_phys_chan_direction_vals[] = { { 0, 0, "Downstream (Server to Client)" }, { 0x0001, 0x0001, "Upstream (Client to Server)" }, { 0x0002, 0xffff, "ISO/IEC 13818-6 Reserved" }, { 0, 0, NULL } }; /* 4-84 IP protocol types */ static const range_string dsmcc_un_sess_rsrc_ip_protocol_types_vals[] = { { 0, 0, "Reserved" }, { 0x0001, 0x0001, "TCP" }, { 0x0002, 0x0002, "UDP" }, { 0x0003, 0x7fff, "Reserved" }, { 0x8000, 0xffff, "User Defined" }, { 0, 0, NULL } }; /* user defined 0xf001-0xf007 - start */ static const range_string dsmcc_un_sess_rsrc_modulation_format_vals[] = { { 0x00, 0x00, "Unknown" }, { 0x01, 0x05, "Reserved" }, { 0x06, 0x06, "QAM16" }, { 0x07, 0x07, "QAM32" }, { 0x08, 0x08, "QAM64" }, { 0x09, 0x0b, "Reserved" }, { 0x0c, 0x0c, "QAM128" }, { 0x0d, 0x0f, "Reserved" }, { 0x10, 0x10, "QAM256" }, { 0x11, 0xff, "Reserved" }, { 0, 0, NULL } }; static const range_string dsmcc_un_sess_rsrc_transmission_system_vals[] = { { 0, 0, "Unknown Transmission System" }, { 0x01, 0x01, "SADVB Transmission System" }, { 0x02, 0x02, "GI Transmission System" }, { 0x03, 0xff, "Reserved" }, { 0, 0, NULL } }; static const range_string dsmcc_un_sess_rsrc_mod_mode_vals[] = { { 0, 0, "No Modulation Mode" }, { 0x01, 0x18, "Reserved" }, { 0x19, 0x19, "QAM 4 Modulation Mode"}, { 0x1a, 0xff, "Reserved" }, { 0, 0, NULL } }; static const range_string dsmcc_un_sess_rsrc_fec_vals[] = { { 0, 0, "FEC Transmission System" }, { 0x01, 0x01, "FEC DAVIC" }, { 0x02, 0xff, "Reserved"}, { 0, 0, NULL } }; static const range_string dsmcc_un_sess_rsrc_headend_flag_vals[] = { { 0, 0, "Invalid" }, { 0x01, 0x01, "The session is intended for the Head End named by the HeadEndId" }, { 0x02, 0x02, "The session is intended for the Head End where the content is introduced to the network" }, { 0x03, 0x03, "The session is intended for all Head Ends that have QAMs"}, { 0x04, 0x04, "The session is intended for the QAM with an output Transport Stream ID named by the TransportStreamId"}, { 0x05, 0xff, "Invalid" }, { 0, 0, NULL } }; /* user defined 0xf001-0xf007 - end */ /* 7-4 */ static const value_string dsmcc_dd_message_id_vals[] = { { 0x1001, "Download Info Request" }, { 0x1002, "Download Info Indication" }, { 0x1003, "Download Data Block" }, { 0x1004, "Download Data Request" }, { 0x1005, "Download Data Cancel" }, { 0x1006, "Download Server Initiate" }, { 0, NULL } }; /* 9-2 */ static const value_string dsmcc_payload_name_vals[] = { { DSMCC_TID_LLCSNAP, "LLCSNAP" }, { DSMCC_TID_UN_MSG, "User Network Message" }, { DSMCC_TID_DD_MSG, "Download Data Message" }, { DSMCC_TID_DESC_LIST, "Descriptor List" }, { DSMCC_TID_PRIVATE, "Private" }, { 0, NULL } }; /* U-N Session Message Flags */ static int * const bf_message_id[] = { &hf_dsmcc_un_sess_flag_message_discriminator, &hf_dsmcc_un_sess_flag_message_scenario, &hf_dsmcc_un_sess_flag_message_type, NULL }; static int * const bf_transaction_id[] = { &hf_dsmcc_un_sess_flag_transaction_id_originator, &hf_dsmcc_un_sess_flag_transaction_id_number, NULL }; static int * const bf_rsrc_number[] = { &hf_dsmcc_un_sess_rsrc_flag_num_assignor, &hf_dsmcc_un_sess_rsrc_flag_num_value, NULL }; static int * const bf_rsrc_association_tag[] = { &hf_dsmcc_un_sess_rsrc_flag_association_tag_assignor, &hf_dsmcc_un_sess_rsrc_flag_association_tag_value, NULL }; static int * const bf_rsrc_flags[] = { &hf_dsmcc_un_sess_rsrc_flag_view, &hf_dsmcc_un_sess_rsrc_flag_attribute, &hf_dsmcc_un_sess_rsrc_flag_allocator, NULL }; /* Table J.3 E.164 NSAP */ static guint dissect_dsmcc_un_session_nsap( tvbuff_t *tvb, guint offset, packet_info *pinfo _U_, proto_tree *sub_tree) { guint offset_start; offset_start = offset; proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_nsap_afi, tvb, offset, 1, ENC_NA); offset += 1; proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_nsap_idi, tvb, offset, 8, ENC_NA); offset += 8; proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_nsap_ho_dsp, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_nsap_esi, tvb, offset, 6, ENC_NA); offset += 6; proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_nsap_sel, tvb, offset, 1, ENC_NA); offset += 1; return offset-offset_start; } /* 4-58 SessionId */ static guint dissect_dsmcc_un_session_id( tvbuff_t *tvb, guint offset, packet_info *pinfo _U_, proto_tree *sub_tree) { proto_tree *sub_sub_tree; guint offset_start; offset_start = offset; sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, 10, ett_dsmcc_heading, NULL, "Session ID"); proto_item_set_text(sub_sub_tree, "Session ID: 0x%s", tvb_bytes_to_str(pinfo->pool, tvb, offset, 10)); proto_tree_add_item(sub_sub_tree, hf_dsmcc_un_sess_session_id_device_id, tvb, offset, 6, ENC_NA); offset += 6; proto_tree_add_item(sub_sub_tree, hf_dsmcc_un_sess_session_id_session_number, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; return offset-offset_start; } /* Table 2-4 Adaptation Header Format */ static void dissect_dsmcc_adaptation_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { tvbuff_t *sub_tvb; guint offset = 0; proto_item *pi; proto_tree *sub_tree; proto_tree *sub_sub_tree; guint8 type, tmp; guint16 ca_len; type = tvb_get_guint8(tvb, offset); if (1 == type) { sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_dsmcc_adaptation_header, NULL, "Adaptation Header"); proto_tree_add_item(sub_tree, hf_dsmcc_adaptation_type, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; tmp = tvb_get_guint8(tvb, offset); pi = proto_tree_add_item(sub_tree, hf_dsmcc_adaptation_ca_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); if (0xff != tmp) { expert_add_info_format(pinfo, pi, &ei_dsmcc_invalid_value, "Invalid value - should be 0xff"); } offset += 1; proto_tree_add_item(sub_tree, hf_dsmcc_adaptation_ca_system_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; ca_len = tvb_get_ntohs(tvb, offset); proto_tree_add_item(sub_tree, hf_dsmcc_adaptation_ca_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; sub_tvb = tvb_new_subset_length(tvb, offset, ca_len); call_data_dissector(sub_tvb, pinfo, tree); } else if (2 == type) { sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_dsmcc_adaptation_header, NULL, "Adaptation Header"); proto_tree_add_item(sub_tree, hf_dsmcc_adaptation_type, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; tmp = tvb_get_guint8(tvb, offset); pi = proto_tree_add_item(sub_tree, hf_dsmcc_adaptation_user_id_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); if (0xff != tmp) { expert_add_info_format(pinfo, pi, &ei_dsmcc_invalid_value, "Invalid value - should be 0xff"); } offset += 1; sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, 20, ett_dsmcc_heading, NULL, "User ID"); dissect_dsmcc_un_session_nsap(tvb, offset, pinfo, sub_sub_tree); } else { sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_dsmcc_adaptation_header, NULL, "Unknown Adaptation Header"); proto_tree_add_item(sub_tree, hf_dsmcc_adaptation_type, tvb, offset, 1, ENC_BIG_ENDIAN); } } /* Table 2-1 DSM-CC Message Header Format */ static guint dissect_dsmcc_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset, gboolean download_header) { tvbuff_t *sub_tvb; proto_item *pi; proto_tree *sub_tree; guint8 prot_disc, adaptation_len; guint reserved, offset_start; int msg_id, tx_id; offset_start = offset; prot_disc = tvb_get_guint8(tvb, offset); reserved = tvb_get_guint8(tvb, 8+offset); adaptation_len = tvb_get_guint8(tvb, 9+offset); sub_tree = proto_tree_add_subtree(tree, tvb, offset, 12+adaptation_len, ett_dsmcc_header, NULL, "DSM-CC Header"); pi = proto_tree_add_item(sub_tree, hf_dsmcc_protocol_discriminator, tvb, offset, 1, ENC_BIG_ENDIAN); if (DSMCC_PROT_DISC != prot_disc) { expert_add_info_format(pinfo, pi, &ei_dsmcc_invalid_value, "Invalid value - should be 0x11"); } offset += 1; proto_tree_add_item(sub_tree, hf_dsmcc_type, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; if (TRUE == download_header) { msg_id = hf_dsmcc_dd_message_id; tx_id = hf_dsmcc_dd_download_id; proto_tree_add_item(sub_tree, msg_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(sub_tree, tx_id, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; } else { msg_id = hf_dsmcc_message_id; tx_id = hf_dsmcc_transaction_id; proto_tree_add_bitmask_with_flags(sub_tree, tvb, offset, msg_id, ett_dsmcc_message_id, bf_message_id, ENC_BIG_ENDIAN, BMT_NO_APPEND); offset += 2; proto_tree_add_bitmask_with_flags(sub_tree, tvb, offset, tx_id, ett_dsmcc_transaction_id, bf_transaction_id, ENC_BIG_ENDIAN, BMT_NO_APPEND); offset += 4; } pi = proto_tree_add_item(sub_tree, hf_dsmcc_header_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); if (0xff != reserved) { expert_add_info_format(pinfo, pi, &ei_dsmcc_invalid_value, "Invalid value - should be 0xff"); } offset += 1; proto_tree_add_item(sub_tree, hf_dsmcc_adaptation_length, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; proto_tree_add_item(sub_tree, hf_dsmcc_message_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; if (0 < adaptation_len) { sub_tvb = tvb_new_subset_length(tvb, offset, adaptation_len); dissect_dsmcc_adaptation_header(sub_tvb, pinfo, sub_tree); offset += adaptation_len; } return offset-offset_start; } static guint dissect_dsmcc_dii_compat_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset) { gint i, j; guint8 sub_count, sub_len; guint16 len, count; proto_tree *compat_tree; proto_tree *desc_sub_tree; len = tvb_get_ntohs(tvb, offset); proto_tree_add_item(tree, hf_compat_desc_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; if (0 < len) { count = tvb_get_ntohs(tvb, offset); proto_tree_add_item(tree, hf_compat_desc_count, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; for (i = 0; i < count; i++) { compat_tree = proto_tree_add_subtree(tree, tvb, offset, len, ett_dsmcc_compat, NULL, "Compatibility Descriptor"); proto_tree_add_item(compat_tree, hf_desc_type, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; proto_tree_add_item(compat_tree, hf_desc_length, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; proto_tree_add_item(compat_tree, hf_desc_spec_type, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; proto_tree_add_item(compat_tree, hf_desc_spec_data, tvb, offset, 3, ENC_BIG_ENDIAN); offset += 3; proto_tree_add_item(compat_tree, hf_desc_model, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(compat_tree, hf_desc_version, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; sub_count = tvb_get_guint8(tvb, offset); proto_tree_add_item(compat_tree, hf_desc_sub_desc_count, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; for (j = 0; j < sub_count; j++) { sub_len = tvb_get_guint8(tvb, offset+1); desc_sub_tree = proto_tree_add_subtree(compat_tree, tvb, offset, sub_len+2, ett_dsmcc_compat_sub_desc, NULL, "Sub Descriptor"); proto_tree_add_item(desc_sub_tree, hf_desc_sub_desc_type, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; proto_tree_add_item(desc_sub_tree, hf_desc_sub_desc_len, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; offset += sub_len; } } if( 1000 == offset ) { expert_add_info( pinfo, NULL, &ei_dsmcc_crc_invalid); } } return 2 + len; } static void dissect_dsmcc_dii(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset) { guint16 modules, module_id, private_data_len; guint8 module_info_len, module_version; guint i, module_size; proto_tree *mod_tree; proto_tree_add_item(tree, hf_dsmcc_dii_download_id, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; proto_tree_add_item(tree, hf_dsmcc_dii_block_size, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_dsmcc_dii_window_size, tvb, offset, 1, ENC_BIG_ENDIAN); offset +=1; proto_tree_add_item(tree, hf_dsmcc_dii_ack_period, tvb, offset, 1, ENC_BIG_ENDIAN); offset +=1; proto_tree_add_item(tree, hf_dsmcc_dii_t_c_download_window, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; proto_tree_add_item(tree, hf_dsmcc_dii_t_c_download_scenario, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; offset += dissect_dsmcc_dii_compat_desc(tvb, pinfo, tree, offset); proto_tree_add_item(tree, hf_dsmcc_dii_number_of_modules, tvb, offset, 2, ENC_BIG_ENDIAN); modules = tvb_get_ntohs(tvb, offset); offset += 2; for (i = 0; i < modules; i++ ) { module_id = tvb_get_ntohs(tvb, offset); module_size = tvb_get_ntohl(tvb, 2+offset); module_version = tvb_get_guint8(tvb, 6+offset); mod_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_dsmcc_dii_module, NULL, "Module Id: 0x%x, Version: %u, Size: %u", module_id, module_version, module_size); proto_tree_add_item(mod_tree, hf_dsmcc_dii_module_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(mod_tree, hf_dsmcc_dii_module_size, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; proto_tree_add_item(mod_tree, hf_dsmcc_dii_module_version, tvb, offset, 1, ENC_BIG_ENDIAN); offset +=1; module_info_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(mod_tree, hf_dsmcc_dii_module_info_length, tvb, offset, 1, ENC_BIG_ENDIAN); offset +=1; if (0 < module_info_len) { proto_tree_add_item(mod_tree, hf_etv_module_abs_path, tvb, offset, 1, ENC_ASCII|ENC_BIG_ENDIAN); offset += module_info_len; } } private_data_len = tvb_get_ntohs(tvb, offset); proto_tree_add_item(tree, hf_dsmcc_dii_private_data_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; if (0 < private_data_len) { proto_tree_add_item(tree, hf_etv_dii_authority, tvb, offset, 1, ENC_ASCII|ENC_BIG_ENDIAN); /*offset += private_data_len;*/ } } static void dissect_dsmcc_ddb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *top_tree, guint offset) { tvbuff_t *sub_tvb; proto_item *pi; guint8 reserved; proto_tree_add_item(tree, hf_dsmcc_ddb_module_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_dsmcc_ddb_version, tvb, offset, 1, ENC_BIG_ENDIAN); offset +=1; reserved = tvb_get_guint8(tvb, offset); pi = proto_tree_add_item(tree, hf_dsmcc_ddb_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); if (0xff != reserved) { expert_add_info_format(pinfo, pi, &ei_dsmcc_invalid_value, "Invalid value - should be 0xff"); } offset +=1; proto_tree_add_item(tree, hf_dsmcc_ddb_block_number, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; sub_tvb = tvb_new_subset_remaining(tvb, offset); call_data_dissector(sub_tvb, pinfo, top_tree); } static void dissect_dsmcc_un_download(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *top_tree) { proto_tree *sub_tree; guint16 msg_id; guint offset = 0; msg_id = tvb_get_ntohs(tvb, offset+2); sub_tree = proto_tree_add_subtree_format(tree, tvb, 0, -1, ett_dsmcc_payload, NULL, "User Network Message - %s", val_to_str(msg_id, dsmcc_dd_message_id_vals, "%u")); switch (msg_id) { case 0x1001: case 0x1002: offset += dissect_dsmcc_header(tvb, pinfo, sub_tree, offset, FALSE); dissect_dsmcc_dii(tvb, pinfo, sub_tree, offset); break; case 0x1003: offset += dissect_dsmcc_header(tvb, pinfo, sub_tree, offset, TRUE); dissect_dsmcc_ddb(tvb, pinfo, sub_tree, top_tree, offset); break; case 0x1004: /* TODO: Add support */ break; case 0x1005: /* TODO: Add support */ break; case 0x1006: /* TODO: Add support */ break; default: break; } } /* table 4-71 dsmccResourceDescriptorValue format*/ static guint dissect_dsmcc_un_session_resource_value( tvbuff_t *tvb, guint offset, packet_info *pinfo _U_, proto_tree *sub_tree, guint value_len) { guint32 i, counter, resource_value_type; guint offset_start; offset_start = offset; proto_tree_add_item_ret_uint(sub_tree, hf_dsmcc_un_sess_rsrc_value_type, tvb, offset, 2, ENC_BIG_ENDIAN, &resource_value_type); offset += 2; if (resource_value_type == 1) /* single value */ { proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_rsrc_value_data, tvb, offset, value_len, ENC_NA); offset += value_len; } else if (resource_value_type == 2) /* list value */ { proto_tree_add_item_ret_uint(sub_tree, hf_dsmcc_un_sess_rsrc_value_count, tvb, offset, 2, ENC_BIG_ENDIAN, &counter); offset += 2; for (i=0; i 4)) { expert_add_info_format(pinfo, pi, &ei_dsmcc_invalid_value, "Invalid value - should be values 1 to 4"); } offset += 2; sub_sub_sub_sub_tree = proto_tree_add_subtree(sub_sub_sub_tree, tvb, offset, 20, ett_dsmcc_heading, NULL, "Headend ID:"); offset += dissect_dsmcc_un_session_nsap(tvb, offset, pinfo, sub_sub_sub_sub_tree); proto_tree_add_item(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_headend_tsid, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; break; /* User Defined - Server Conditional Access */ case RSRC_SERVER_CA: rsrc_tree = proto_tree_add_subtree(sub_sub_sub_tree, tvb, offset, 0, ett_dsmcc_heading, NULL, "Server CA System ID:"); offset += dissect_dsmcc_un_session_resource_value(tvb, offset, pinfo, rsrc_tree, 2); proto_tree_add_item(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_server_ca_copyprotect, tvb, offset, 2, ENC_NA); offset += 2; proto_tree_add_item_ret_uint(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_server_ca_usercount, tvb, offset, 2, ENC_BIG_ENDIAN, &counter); offset += 2; for (i=0; i 0) { proto_tree_add_item(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_client_ca_info_data, tvb, offset, counter_ca, ENC_NA); offset = offset + counter_ca; } break; /* User Defined - Ethernet Interface */ case RSRC_ETHERNET: rsrc_tree = proto_tree_add_subtree(sub_sub_sub_tree, tvb, offset, 0, ett_dsmcc_heading, NULL, "Ethernet Source UDP:"); offset += dissect_dsmcc_un_session_resource_value(tvb, offset, pinfo, rsrc_tree, 2); rsrc_tree = proto_tree_add_subtree(sub_sub_sub_tree, tvb, offset, 0, ett_dsmcc_heading, NULL, "Ethernet Source IP:"); offset += dissect_dsmcc_un_session_resource_value(tvb, offset, pinfo, rsrc_tree, 4); rsrc_tree = proto_tree_add_subtree(sub_sub_sub_tree, tvb, offset, 0, ett_dsmcc_heading, NULL, "Ethernet Source MAC:"); offset += dissect_dsmcc_un_session_resource_value(tvb, offset, pinfo, rsrc_tree, 6); rsrc_tree = proto_tree_add_subtree(sub_sub_sub_tree, tvb, offset, 0, ett_dsmcc_heading, NULL, "Ethernet Destination UDP:"); offset += dissect_dsmcc_un_session_resource_value(tvb, offset, pinfo, rsrc_tree, 2); rsrc_tree = proto_tree_add_subtree(sub_sub_sub_tree, tvb, offset, 0, ett_dsmcc_heading, NULL, "Ethernet Destination IP:"); offset += dissect_dsmcc_un_session_resource_value(tvb, offset, pinfo, rsrc_tree, 4); rsrc_tree = proto_tree_add_subtree(sub_sub_sub_tree, tvb, offset, 0, ett_dsmcc_heading, NULL, "Ethernet Destination MAC:"); offset += dissect_dsmcc_un_session_resource_value(tvb, offset, pinfo, rsrc_tree, 6); break; /* User Defined - Service Group */ case RSRC_SERVICE_GROUP: proto_tree_add_item(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_value_type, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_service_group, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; break; /* Table 4-90 Shared Resource */ case RSRC_SHARED_RSRC: proto_tree_add_item(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_shared_resource_num, tvb, offset, 2, ENC_NA); offset += 2; break; /* Table 4-91 Shared Resource Request ID */ case RSRC_SHARED_REQ_ID: proto_tree_add_item(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_shared_resource_request_id, tvb, offset, 2, ENC_NA); offset += 2; break; /* Table 4-63 Type Owner */ case RSRC_TYPE_OWNER: proto_tree_add_item(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_type_owner_id, tvb, offset, 3, ENC_NA); offset += 3; proto_tree_add_item(sub_sub_sub_tree, hf_dsmcc_un_sess_rsrc_type_owner_value, tvb, offset, 3, ENC_NA); offset += 3; break; default: break; } } return offset-offset_start; } /* UserData() is vendor proprietary, therefore not dissected. */ static guint dissect_dsmcc_un_session_user_data( tvbuff_t *tvb, guint offset, packet_info *pinfo _U_, proto_tree *tree) { guint offset_start; guint16 uu_len, priv_len; offset_start = offset; uu_len = tvb_get_ntohs(tvb, offset); proto_tree_add_item(tree, hf_dsmcc_un_sess_uu_data_len, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; if (uu_len>0) { proto_tree_add_item(tree, hf_dsmcc_un_sess_uu_data, tvb, offset, uu_len, ENC_NA); offset += uu_len; } priv_len = tvb_get_ntohs(tvb, offset); proto_tree_add_item(tree, hf_dsmcc_un_sess_priv_data_len, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; if (priv_len>0) { proto_tree_add_item(tree, hf_dsmcc_un_sess_priv_data, tvb, offset, priv_len, ENC_NA); offset += priv_len; } return offset-offset_start; } static void dissect_dsmcc_un_session(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *top_tree _U_) { proto_item *pi; proto_tree *sub_tree; proto_tree *sub_sub_tree; guint32 i, counter; guint16 msg_id; guint offset = 0; msg_id = tvb_get_ntohs(tvb, offset+2); sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_dsmcc_payload, &pi, "User Network Message (Session) - %s", val_to_str(msg_id, dsmcc_un_sess_message_id_vals, "0x%x")); col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, val_to_str(msg_id, dsmcc_un_sess_message_id_vals, "0x%x")); offset += dissect_dsmcc_header(tvb, pinfo, sub_tree, offset, FALSE); switch (msg_id) { /* CLIENT Messages */ case DSMCC_UN_SESS_CLN_SESS_SET_REQ: offset += dissect_dsmcc_un_session_id(tvb, offset, pinfo, sub_tree); proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; /* client nsap */ sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, 20, ett_dsmcc_heading, NULL, "Client ID"); offset += dissect_dsmcc_un_session_nsap(tvb, offset, pinfo, sub_sub_tree); /* server nsap */ sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, 20, ett_dsmcc_heading, NULL, "Server ID"); offset += dissect_dsmcc_un_session_nsap(tvb, offset, pinfo, sub_sub_tree); /* user data */ sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "User Data"); offset += dissect_dsmcc_un_session_user_data(tvb, offset, pinfo, sub_sub_tree); break; case DSMCC_UN_SESS_CLN_SESS_SET_CNF: offset += dissect_dsmcc_un_session_id(tvb, offset, pinfo, sub_tree); proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_response, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, 20, ett_dsmcc_heading, NULL, "Server ID"); offset += dissect_dsmcc_un_session_nsap(tvb, offset, pinfo, sub_sub_tree); sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "Resources"); offset += dissect_dsmcc_un_session_resources(tvb, offset, pinfo, sub_sub_tree); sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "User Data"); offset += dissect_dsmcc_un_session_user_data(tvb, offset, pinfo, sub_sub_tree); break; case DSMCC_UN_SESS_CLN_SESS_REL_REQ: offset += dissect_dsmcc_un_session_id(tvb, offset, pinfo, sub_tree); proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_reason, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "User Data"); offset += dissect_dsmcc_un_session_user_data(tvb, offset, pinfo, sub_sub_tree); break; case DSMCC_UN_SESS_CLN_SESS_REL_CNF: offset += dissect_dsmcc_un_session_id(tvb, offset, pinfo, sub_tree); proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_response, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "User Data"); offset += dissect_dsmcc_un_session_user_data(tvb, offset, pinfo, sub_sub_tree); break; case DSMCC_UN_SESS_CLN_SESS_REL_IND: offset += dissect_dsmcc_un_session_id(tvb, offset, pinfo, sub_tree); proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_reason, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "User Data"); offset += dissect_dsmcc_un_session_user_data(tvb, offset, pinfo, sub_sub_tree); break; case DSMCC_UN_SESS_CLN_SESS_REL_RES: offset += dissect_dsmcc_un_session_id(tvb, offset, pinfo, sub_tree); proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_response, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "User Data"); offset += dissect_dsmcc_un_session_user_data(tvb, offset, pinfo, sub_sub_tree); break; case DSMCC_UN_SESS_CLN_ADD_RSRC_IND: offset += dissect_dsmcc_un_session_id(tvb, offset, pinfo, sub_tree); sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "Resources"); offset += dissect_dsmcc_un_session_resources(tvb, offset, pinfo, sub_sub_tree); sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "User Data"); offset += dissect_dsmcc_un_session_user_data(tvb, offset, pinfo, sub_sub_tree); break; case DSMCC_UN_SESS_CLN_ADD_RSRC_RES: offset += dissect_dsmcc_un_session_id(tvb, offset, pinfo, sub_tree); proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_response, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "Resources"); offset += dissect_dsmcc_un_session_resources(tvb, offset, pinfo, sub_sub_tree); sub_sub_tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, ett_dsmcc_heading, NULL, "User Data"); offset += dissect_dsmcc_un_session_user_data(tvb, offset, pinfo, sub_sub_tree); break; case DSMCC_UN_SESS_CLN_DEL_RSRC_IND: offset += dissect_dsmcc_un_session_id(tvb, offset, pinfo, sub_tree); proto_tree_add_item(sub_tree, hf_dsmcc_un_sess_reason, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item_ret_uint(sub_tree, hf_dsmcc_un_sess_resource_count, tvb, offset, 2, ENC_BIG_ENDIAN, &counter); offset += 2; for (i=0; icinfo, COL_PROTOCOL, "DSM-CC"); tid = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_dsmcc_table_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset +=1; ssi = tvb_get_ntohs(tvb, offset); ssi &= DSMCC_SSI_MASK; proto_tree_add_item(tree, hf_dsmcc_section_syntax_indicator, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_dsmcc_private_indicator, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_dsmcc_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_dsmcc_section_length, tvb, offset, 2, ENC_BIG_ENDIAN); sect_len = tvb_get_ntohs(tvb, offset); sect_len &= DSMCC_LENGTH_MASK; offset += 2; proto_tree_add_item(tree, hf_dsmcc_table_id_extension, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_dsmcc_reserved2, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_dsmcc_version_number, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_dsmcc_current_next_indicator, tvb, offset, 1, ENC_BIG_ENDIAN); offset +=1; proto_tree_add_item(tree, hf_dsmcc_section_number, tvb, offset, 1, ENC_BIG_ENDIAN); offset +=1; proto_tree_add_item(tree, hf_dsmcc_last_section_number, tvb, offset, 1, ENC_BIG_ENDIAN); offset +=1; sub_tvb = tvb_new_subset_length(tvb, offset, sect_len-9); switch (tid) { case DSMCC_TID_LLCSNAP: /* TODO: Add support */ break; case DSMCC_TID_UN_MSG: case DSMCC_TID_DD_MSG: dissect_dsmcc_un(sub_tvb, pinfo, tree, tree_in); break; case DSMCC_TID_DESC_LIST: /* TODO: Add support */ break; case DSMCC_TID_PRIVATE: /* TODO: Add support */ break; default: break; } crc_len = 3 + sect_len - 4; /* Add the header, remove the crc */ if (ssi) { crc = tvb_get_ntohl(tvb, crc_len); calculated_crc = crc; label = "Unverified"; if (dsmcc_sect_check_crc) { label = "Verified"; calculated_crc = crc32_mpeg2_tvb_offset(tvb, 0, crc_len); } if (calculated_crc == crc) { proto_tree_add_uint_format( tree, hf_dsmcc_crc, tvb, crc_len, 4, crc, "CRC: 0x%08x [%s]", crc, label); } else { proto_item *msg_error; msg_error = proto_tree_add_uint_format( tree, hf_dsmcc_crc, tvb, crc_len, 4, crc, "CRC: 0x%08x [Failed Verification (Calculated: 0x%08x)]", crc, calculated_crc ); proto_item_set_generated(msg_error); expert_add_info( pinfo, msg_error, &ei_dsmcc_crc_invalid); } } else { /* TODO: actually check the checksum */ proto_tree_add_checksum(tree, tvb, crc_len, hf_dsmcc_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } return tvb_reported_length(tvb); } static int dissect_dsmcc_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { proto_item *pi; proto_tree *sub_tree; if (tvb_get_guint8(tvb, 0) != DSMCC_PROT_DISC) return 0; col_set_str(pinfo->cinfo, COL_PROTOCOL, "DSM-CC"); col_clear(pinfo->cinfo, COL_INFO); pi = proto_tree_add_item(tree, proto_dsmcc, tvb, 0, -1, ENC_NA); sub_tree = proto_item_add_subtree(pi, ett_dsmcc); dissect_dsmcc_un(tvb, pinfo, sub_tree, tree); return tvb_reported_length(tvb); } static int dissect_dsmcc_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { proto_item *pi; proto_tree *sub_tree; if (tvb_get_guint8(tvb, 0) != DSMCC_PROT_DISC) return 0; col_set_str(pinfo->cinfo, COL_PROTOCOL, "DSM-CC"); col_clear(pinfo->cinfo, COL_INFO); pi = proto_tree_add_item(tree, proto_dsmcc, tvb, 0, -1, ENC_NA); sub_tree = proto_item_add_subtree(pi, ett_dsmcc); dissect_dsmcc_un(tvb, pinfo, sub_tree, tree); return tvb_reported_length(tvb); } void proto_register_dsmcc(void) { /* NOTE: Please add tables numerically according to 13818-6 so it is * easier to keep track of what parameters/tables are associated with * each other. */ static hf_register_info hf[] = { /* table 2-1 dsmccMessageHeader - start */ { &hf_dsmcc_protocol_discriminator, { "Protocol Discriminator", "mpeg_dsmcc.protocol", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_type, { "Type", "mpeg_dsmcc.type", FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_header_type_vals), 0, NULL, HFILL } }, { &hf_dsmcc_message_id, { "Message ID", "mpeg_dsmcc.message_id", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_transaction_id, { "Transaction ID", "mpeg_dsmcc.transaction_id", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_header_reserved, { "Reserved", "mpeg_dsmcc.header_reserved", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_adaptation_length, { "Adaptation Length", "mpeg_dsmcc.adaptation_length", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_message_length, { "Message Length", "mpeg_dsmcc.message_length", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, /* table 2-1 dsmccMessageHeader - end */ /* table 2-3 Transaction ID originator - start */ { &hf_dsmcc_un_sess_flag_transaction_id_originator, { "Transaction ID Originator", "mpeg_dsmcc.transaction_id_originator", FT_UINT32, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_transaction_id_originator_vals), DMSCC_FLAG_TRAN_ORIG, NULL, HFILL } }, { &hf_dsmcc_un_sess_flag_transaction_id_number, { "Transaction Number", "mpeg_dsmcc.transaction_id_number", FT_UINT32, BASE_DEC, NULL, DMSCC_FLAG_TRAN_NUM, NULL, HFILL } }, /* table 2-3 Transaction ID originator - end */ /* table 2-4 dsmccAdaptationHeader - start */ { &hf_dsmcc_adaptation_type, { "Adaptation Type", "mpeg_dsmcc.adaptation_header.type", FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_adaptation_header_vals), 0, NULL, HFILL } }, /* table 2-4 dsmccAdaptationHeader - end */ /* table 2-6 dsmccConditionalAccess - start */ { &hf_dsmcc_adaptation_ca_reserved, { "Reserved", "mpeg_dsmcc.adaptation_header.ca.reserved", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_adaptation_ca_system_id, { "CA System ID", "mpeg_dsmcc.adaptation_header.ca.system_id", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_adaptation_ca_length, { "CA Length", "mpeg_dsmcc.adaptation_header.ca.length", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, /* table 2-6 dsmccConditionalAccess - end */ /* table 2-7 dsmccUserId - start */ { &hf_dsmcc_adaptation_user_id_reserved, { "Reserved", "mpeg_dsmcc.adaptation_header.uid.reserved", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, /* table 2-7 dsmccUserId - end */ /* other tables in section 4.2 - start */ { &hf_dsmcc_un_sess_response, { "Response", "mpeg_dsmcc.un_sess.response", FT_UINT16, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_message_response_codes_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_reason, { "Reason", "mpeg_dsmcc.un_sess.reason", FT_UINT16, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_message_reason_codes_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_reserved, { "Reserved", "mpeg_dsmcc.un_sess.reserved", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, /* other tables in section 4.2 - end */ /* table 4-2 message discriminator - start */ { &hf_dsmcc_un_sess_flag_message_discriminator, { "Message Discriminator", "mpeg_dsmcc.message_discriminator", FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_message_discriminator_vals), DMSCC_FLAG_MESS_DISCRIMINATOR, NULL, HFILL } }, /* table 4-2 message discriminator - end */ /* table 4-3 message scenario - start */ { &hf_dsmcc_un_sess_flag_message_scenario, { "Message Scenario", "mpeg_dsmcc.message_scenario", FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_message_scenario_vals), DMSCC_FLAG_MESS_SCENARIO, NULL, HFILL } }, /* table 4-3 message scenario - end */ /* table 4-4 message type - start */ { &hf_dsmcc_un_sess_flag_message_type, { "Message Type", "mpeg_dsmcc.message_type", FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_message_type_vals), DMSCC_FLAG_MESS_TYPE, NULL, HFILL } }, /* table 4-4 message type - end */ /* table 4-5 U-N Resources - start */ { &hf_dsmcc_un_sess_rsrc_desc_count, { "Resource Descriptor Count", "mpeg_dsmcc.un_sess.rsrc_desc_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, /* table 4-5 U-N Resources - end */ /* table 4-6 U-N user data format - start */ { &hf_dsmcc_un_sess_uu_data_len, { "User data length", "mpeg_dsmcc.un_sess.uu_data_len", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_uu_data, { "User data", "mpeg_dsmcc.un_sess.uu_data", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_priv_data_len, { "Private data length", "mpeg_dsmcc.un_sess.priv_data_len", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_priv_data, { "Private data", "mpeg_dsmcc.un_sess.priv_data", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-6 U-N user data format - end */ /* 4-10 - Server Session Setup Indication message - start */ { &hf_dsmcc_un_sess_forward_count, { "Forward Count", "mpeg_dsmcc.un_sess.forward_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, /* 4-10 - Server Session Setup Indication message - start */ /* 4-26 - start */ { &hf_dsmcc_un_sess_resource_count, { "Resource Count", "mpeg_dsmcc.un_sess.resource_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_resource_num, { "Resource Number", "mpeg_dsmcc.un_sess.resource_num", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* 4-26 - end */ /* table 4-35 ServerStatusRequest message, 4-36 ServerStatusConfirm message - start */ { &hf_dsmcc_un_sess_status_type, { "Status Type", "mpeg_dsmcc.un_sess.status_type", FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_status_type_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_status_count, { "Status Count (Bytes)", "mpeg_dsmcc.un_sess.status_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_status_byte, { "Status Byte", "mpeg_dsmcc.un_sess.status_byte", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-35 ServerStatusRequest message, 4-36 ServerStatusConfirm message - end */ /* table 4-56 - start */ { &hf_dsmcc_un_sess_session_count, { "Session Count", "mpeg_dsmcc.un_sess.session_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, /* table 4-56 - end */ /* table 4-58 Message Fields data types - start */ { &hf_dsmcc_un_sess_session_id_device_id, { "Device ID", "mpeg_dsmcc.un_sess.session_id_device_id", FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_session_id_session_number, { "Session Number", "mpeg_dsmcc.un_sess.session_id_session_number", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } }, /* table 4-58 Message Fields data types - start */ /* table 4-63 U-N common descriptor header - start */ { &hf_dsmcc_un_sess_rsrc_request_id, { "Request ID", "mpeg_dsmcc.un_sess.rsrc_request_id", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_descriptor_type, { "Descriptor Type", "mpeg_dsmcc.un_sess.rsrc_descriptor_type", FT_UINT16, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_descriptor_type_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_number, { "Resource Num", "mpeg_dsmcc.un_sess.rsrc_number", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_association_tag, { "Association Tag", "mpeg_dsmcc.un_sess.rsrc_association_tag", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_flags, { "Resource Flags", "mpeg_dsmcc.un_sess.rsrc_flags", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_status, { "Resource Status", "mpeg_dsmcc.un_sess.rsrc_status", FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_status_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_desc_data_fields_length, { "Data Fields Length", "mpeg_dsmcc.un_sess.rsrc_desc_data_fields_length", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_data_field_count, { "Data Field Count", "mpeg_dsmcc.un_sess.rsrc_data_field_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_type_owner_id, { "Type Owner ID", "mpeg_dsmcc.un_sess.rsrc_type_owner_id", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_type_owner_value, { "Type Owner Value", "mpeg_dsmcc.un_sess.rsrc_type_owner_value", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-63 U-N common descriptor header - end */ /* table 4-64 U-N resource number assignor - start */ { &hf_dsmcc_un_sess_rsrc_flag_num_assignor, { "Resource Num Assignor", "mpeg_dsmcc.un_sess.rsrc_flag_num_assignor", FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_number_assignor_vals), DMSCC_FLAG_RSRC_NUM_ASSIGNOR, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_flag_num_value, { "Resource Num Value", "mpeg_dsmcc.un_sess.rsrc_flag_num_value", FT_UINT16, BASE_DEC, NULL, DMSCC_FLAG_RSRC_NUM_VALUE, NULL, HFILL } }, /* table 4-64 U-N resource number assignor - end */ /* table 4-65 U-N resource association tag assignor - start */ { &hf_dsmcc_un_sess_rsrc_flag_association_tag_assignor, { "Association Tag Assignor", "mpeg_dsmcc.un_sess.rsrc_flag_association_tag_assignor", FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_association_tag_vals), DMSCC_FLAG_RSRC_ASSOC_TAG_ASSIGNOR, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_flag_association_tag_value, { "Association Tag Value", "mpeg_dsmcc.un_sess.rsrc_flag_association_tag_value", FT_UINT16, BASE_DEC, NULL, DMSCC_FLAG_RSRC_ASSOC_TAG_VALUE, NULL, HFILL } }, /* table 4-65 U-N resource association tag assignor - end */ /* table 4-66 U-N resource allocator - start */ { &hf_dsmcc_un_sess_rsrc_flag_allocator, { "Resource Allocator", "mpeg_dsmcc.un_sess.rsrc_flag_allocator", FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_allocator_vals), DMSCC_FLAG_RSRC_ALLOCATOR, NULL, HFILL } }, /* table 4-66 U-N resource allocator - end */ /* table 4-67 U-N resource attribute - start */ { &hf_dsmcc_un_sess_rsrc_flag_attribute, { "Resource Attribute", "mpeg_dsmcc.un_sess.rsrc_flag_attribute", FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_attribute_vals), DMSCC_FLAG_RSRC_ATTRIBUTE, NULL, HFILL } }, /* table 4-67 U-N resource attribute - end */ /* table 4-68 U-N resource view - start */ { &hf_dsmcc_un_sess_rsrc_flag_view, { "Resource View", "mpeg_dsmcc.un_sess.rsrc_flag_view", FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_view_vals), DMSCC_FLAG_RSRC_VIEW, NULL, HFILL } }, /* table 4-68 U-N resource view - end */ /* table 4-71 U-N dsmccResourceDescriptorValue() field format - start */ { &hf_dsmcc_un_sess_rsrc_value_type, { "Value Type", "mpeg_dsmcc.un_sess.rsrc_value_type", FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_value_types_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_value_count, { "Value Count", "mpeg_dsmcc.un_sess.rsrc_value_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_value_data, { "Value Data", "mpeg_dsmcc.un_sess.rsrc_value_data", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_most_desired, { "Most Desired", "mpeg_dsmcc.un_sess.rsrc_most_desired", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_least_desired, { "Least Desired", "mpeg_dsmcc.un_sess.rsrc_least_desired", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-71 U-N dsmccResourceDescriptorValue() field format - end */ /* table 4-74 U-N Continuous Feed Session resource descriptor - start */ { &hf_dsmcc_un_sess_rsrc_cfs_num_count, { "Resource Num Count", "mpeg_dsmcc.un_sess.rsrc_cfs_num_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_cfs_num, { "Resource Number", "mpeg_dsmcc.un_sess.rsrc_cfs_num", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-74 U-N Continuous Feed Session resource descriptor - end */ /* table 4-75 U-N ATM Connection resource descriptor - start */ { &hf_dsmcc_un_sess_rsrc_atm_vpi, { "ATM VPI", "mpeg_dsmcc.un_sess.rsrc_atm_vpi", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_atm_vci, { "ATM VCI", "mpeg_dsmcc.un_sess.rsrc_atm_vci", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-75 U-N ATM Connection resource descriptor - end */ /* table 4-76 MPEG Program - start */ { &hf_dsmcc_un_sess_rsrc_mpeg_ca_pid, { "MPEG CA PID", "mpeg_dsmcc.un_sess.rsrc_mpeg_ca_pid", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_mpeg_elem_stream_count, { "Elementary Stream Count", "mpeg_dsmcc.un_sess.rsrc_mpeg_elem_stream_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_reserved, { "Reserved", "mpeg_dsmcc.un_sess.rsrc_reserved", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-76 MPEG Program - end */ /* table 4-77 Physical Channel - start */ { &hf_dsmcc_un_sess_rsrc_phys_chan_direction, { "Channel Direction", "mpeg_dsmcc.un_sess.rsrc_phys_chan_direction", FT_UINT16, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_phys_chan_direction_vals), 0, NULL, HFILL } }, /* table 4-77 Physical Channel - end */ /* table 4-84 IP - start */ { &hf_dsmcc_un_sess_rsrc_src_ip_addr, { "Source IP Address", "mpeg_dsmcc.un_sess.rsrc_src_ip_addr", FT_IPv4, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_src_ip_port, { "Source IP Port", "mpeg_dsmcc.un_sess.rsrc_src_ip_port", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_dst_ip_addr, { "Destination IP Address", "mpeg_dsmcc.un_sess.rsrc_dst_ip_addr", FT_IPv4, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_dst_ip_port, { "Destination IP Port", "mpeg_dsmcc.un_sess.rsrc_dst_ip_port", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_ip_protocol, { "IP Protocol", "mpeg_dsmcc.un_sess.rsrc_ip_protocol", FT_UINT16, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_ip_protocol_types_vals), 0, NULL, HFILL } }, /* table 4-84 IP - end */ /* table 4-86 PSTN Setup - start */ { &hf_dsmcc_un_sess_rsrc_pstn_calling_id, { "Calling ID", "mpeg_dsmcc.un_sess.rsrc_pstn_calling_id", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_pstn_called_id, { "Called ID", "mpeg_dsmcc.un_sess.rsrc_pstn_called_id", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-86 PSTN Setup - end */ /* table 4-89 Q.922 Connection - start */ { &hf_dsmcc_un_sess_rsrc_dlci_count, { "DL CI Count", "mpeg_dsmcc.un_sess.rsrc_dlci_count", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_dlci, { "DL CI", "mpeg_dsmcc.un_sess.rsrc_dlci", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_dl_association_tag, { "Association Tag", "mpeg_dsmcc.un_sess.rsrc_dl_association_tag", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-89 Q.922 Connection - end */ /* table 4-90 Shared Resource - start */ { &hf_dsmcc_un_sess_rsrc_shared_resource_num, { "Shared Resource Num", "mpeg_dsmcc.un_sess.rsrc_shared_resource_num", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-90 Shared Resource - end */ /* table 4-91 Shared Request ID - start */ { &hf_dsmcc_un_sess_rsrc_shared_resource_request_id, { "Shared Request ID", "mpeg_dsmcc.un_sess.rsrc_shared_resource_request_id", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-91 Shared Request ID - end */ /* table 4-92 Headend List - start */ { &hf_dsmcc_un_sess_rsrc_headend_count, { "Headend Count", "mpeg_dsmcc.un_sess.rsrc_headend_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_headend_code, { "Headend Code", "mpeg_dsmcc.un_sess.rsrc_headend_code", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-92 Headend List - end */ /* table 4-94 Continuous Feed - start */ { &hf_dsmcc_un_sess_rsrc_sdb_id, { "SDB ID", "mpeg_dsmcc.un_sess.rsrc_sdb_id", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_sdb_program_count, { "Program Count", "mpeg_dsmcc.un_sess.rsrc_sdb_program_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_sdb_association_tag, { "Association Tag", "mpeg_dsmcc.un_sess.rsrc_sdb_association_tag", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_sdb_broadcast_program_id, { "Broadcast Program ID", "mpeg_dsmcc.un_sess.rsrc_sdb_broadcast_program_id", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-94 Continuous Feed - end */ /* table 4-95 SDB Associations - start */ { &hf_dsmcc_un_sess_rsrc_sdb_control_association_tag, { "Control Association Tag", "mpeg_dsmcc.un_sess.rsrc_sdb_control_association_tag", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_sdb_program_association_tag, { "Program Association Tag", "mpeg_dsmcc.un_sess.rsrc_sdb_program_association_tag", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table 4-95 SDB Associations - end */ /* table 4-96 SDB Entitlement - start */ { &hf_dsmcc_un_sess_rsrc_sdb_exclude_count, { "Exclude Count", "mpeg_dsmcc.un_sess.rsrc_sdb_exclude_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_sdb_include_count, { "Include Count", "mpeg_dsmcc.un_sess.rsrc_sdb_include_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, /* table 4-96 SDB Entitlement - end */ /* User defined 0xf001-0xf007 - start */ { &hf_dsmcc_un_sess_rsrc_trans_system, { "Transmission System", "mpeg_dsmcc.un_sess.rsrc_trans_system", FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_transmission_system_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_inner_coding, { "Inner Coding", "mpeg_dsmcc.un_sess.rsrc_inner_coding", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_split_bitstream, { "Split Bitstream", "mpeg_dsmcc.un_sess.rsrc_split_bitstream", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_mod_format, { "Modulation Format", "mpeg_dsmcc.un_sess.rsrc_mod_format", FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_modulation_format_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_symbol_rate, { "Symbol Rate", "mpeg_dsmcc.un_sess.rsrc_symbol_rate", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_interleave_depth, { "Interleave Depth", "mpeg_dsmcc.un_sess.rsrc_interleave_depth", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_modulation_mode, { "Modulation Mode", "mpeg_dsmcc.un_sess.rsrc_modulation_mode", FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_mod_mode_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_fec, { "Forward Error Correction", "mpeg_dsmcc.un_sess.rsrc_fec", FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_fec_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_headend_flag, { "Headend Flag", "mpeg_dsmcc.un_sess.rsrc_headend_flag", FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(dsmcc_un_sess_rsrc_headend_flag_vals), 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_headend_tsid, { "Headend TSID", "mpeg_dsmcc.un_sess.rsrc_headend_tsid", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_server_ca_copyprotect, { "Copy Protect", "mpeg_dsmcc.un_sess.rsrc_server_ca_copyprotect", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_server_ca_usercount, { "User Count", "mpeg_dsmcc.un_sess.rsrc_server_ca_usercount", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_client_ca_info_length, { "CA Info Length", "mpeg_dsmcc.un_sess.rsrc_client_ca_info_length", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_client_ca_info_data, { "CA Info Data", "mpeg_dsmcc.un_sess.rsrc_client_ca_info_data", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_rsrc_service_group, { "Service Group", "mpeg_dsmcc.un_sess.rsrc_service_group", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } }, /* User defined 0xf001-0xf007 - end */ /* table 6-1 compatabilityDescriptor - start */ { &hf_compat_desc_length, { "Compatibility Descriptor Length", "mpeg_dsmcc.dii.compat_desc_len", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_compat_desc_count, { "Descriptor Length", "mpeg_dsmcc.dii.compat_desc_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_desc_type, { "Descriptor Type", "mpeg_dsmcc.dii.compat.type", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_desc_length, { "Descriptor Length", "mpeg_dsmcc.dii.compat.length", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_desc_spec_type, { "Specifier Type", "mpeg_dsmcc.dii.compat.spec_type", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_desc_spec_data, { "Specifier Data", "mpeg_dsmcc.dii.compat.spec_data", FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_desc_model, { "Model", "mpeg_dsmcc.dii.compat.model", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_desc_version, { "Version", "mpeg_dsmcc.dii.compat.version", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_desc_sub_desc_count, { "Version", "mpeg_dsmcc.dii.compat.sub_count", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_desc_sub_desc_type, { "Type", "mpeg_dsmcc.dii.compat.sub_type", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_desc_sub_desc_len, { "Length", "mpeg_dsmcc.dii.compat.sub_len", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, /* table 6-1 compatabilityDescriptor - end */ /* table 7-3 dsmccDownloadDataHeader - start */ { &hf_dsmcc_dd_download_id, { "Download ID", "mpeg_dsmcc.download_id", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dd_message_id, { "Message ID", "mpeg_dsmcc.message_id", FT_UINT16, BASE_HEX, VALS(dsmcc_dd_message_id_vals), 0, NULL, HFILL } }, /* table 7-3 dsmccDownloadDataHeader - end */ /* table 7-6 downloadInfoIndication - start */ { &hf_dsmcc_dii_download_id, { "Download ID", "mpeg_dsmcc.dii.download_id", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_block_size, { "Block Size", "mpeg_dsmcc.dii.block_size", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_window_size, { "Window Size", "mpeg_dsmcc.dii.window_size", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_ack_period, { "ACK Period", "mpeg_dsmcc.dii.ack_period", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_t_c_download_window, { "Carousel Download Window", "mpeg_dsmcc.dii.carousel_download_window", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_t_c_download_scenario, { "Carousel Download Scenario", "mpeg_dsmcc.dii.carousel_download_scenario", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_number_of_modules, { "Number of Modules", "mpeg_dsmcc.dii.module_count", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_module_id, { "Module ID", "mpeg_dsmcc.dii.module_id", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_module_size, { "Module Size", "mpeg_dsmcc.dii.module_size", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_module_version, { "Module Version", "mpeg_dsmcc.dii.module_version", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_module_info_length, { "Module Info Length", "mpeg_dsmcc.dii.module_info_length", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_dii_private_data_length, { "Private Data Length", "mpeg_dsmcc.dii.private_data_length", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, /* table 7-6 downloadInfoIndication - end */ /* table 7-7 dsmccDownloadDataBlock - start */ { &hf_dsmcc_ddb_module_id, { "Module ID", "mpeg_dsmcc.ddb.module_id", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_ddb_version, { "Version", "mpeg_dsmcc.ddb.version", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_ddb_reserved, { "Reserved", "mpeg_dsmcc.ddb.reserved", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_ddb_block_number, { "Block Number", "mpeg_dsmcc.ddb.block_num", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, /* table 7-7 dsmccDownloadDataBlock - end */ /* table 9-2 - start */ { &hf_dsmcc_table_id, { "Table ID", "mpeg_sect.table_id", FT_UINT8, BASE_HEX, VALS(dsmcc_payload_name_vals), 0, NULL, HFILL } }, { &hf_dsmcc_section_syntax_indicator, { "Session Syntax Indicator", "mpeg_sect.ssi", FT_UINT16, BASE_DEC, NULL, DSMCC_SSI_MASK, NULL, HFILL } }, { &hf_dsmcc_private_indicator, { "Private Indicator", "mpeg_dsmcc.private_indicator", FT_UINT16, BASE_DEC, NULL, DSMCC_PRIVATE_MASK, NULL, HFILL } }, { &hf_dsmcc_reserved, { "Reserved", "mpeg_sect.reserved", FT_UINT16, BASE_HEX, NULL, DSMCC_RESERVED_MASK, NULL, HFILL } }, { &hf_dsmcc_section_length, { "Length", "mpeg_sect.section_length", FT_UINT16, BASE_DEC, NULL, DSMCC_LENGTH_MASK, NULL, HFILL } }, { &hf_dsmcc_table_id_extension, { "Table ID Extension", "mpeg_dsmcc.table_id_extension", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_reserved2, { "Reserved", "mpeg_dsmcc.reserved2", FT_UINT8, BASE_HEX, NULL, DSMCC_RESERVED2_MASK, NULL, HFILL } }, { &hf_dsmcc_version_number, { "Version Number", "mpeg_dsmcc.version_number", FT_UINT8, BASE_DEC, NULL, DSMCC_VERSION_NUMBER_MASK, NULL, HFILL } }, { &hf_dsmcc_current_next_indicator, { "Current Next Indicator", "mpeg_dsmcc.current_next_indicator", FT_UINT8, BASE_DEC, NULL, DSMCC_CURRENT_NEXT_INDICATOR_MASK, NULL, HFILL } }, { &hf_dsmcc_section_number, { "Section Number", "mpeg_dsmcc.section_number", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_last_section_number, { "Last Section Number", "mpeg_dsmcc.last_section_number", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_crc, { "CRC 32", "mpeg_sect.crc", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_checksum, { "Checksum", "mpeg_dsmcc.checksum", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL } }, /* table 9-2 - end */ /* table J.3 NSAP - start */ { &hf_dsmcc_un_sess_nsap_afi, { "Authority and Format Identifier (AFI)", "mpeg_dsmcc.un_sess.dsmcc_nsap_afi", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_nsap_idi, { "Initial Domain Identifier (IDI)", "mpeg_dsmcc.un_sess.dsmcc_nsap_idi", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_nsap_ho_dsp, { "High Order DSP (HO-DSP)", "mpeg_dsmcc.un_sess.dsmcc_nsap_ho_dsp", FT_IPv4, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_nsap_esi, { "End System Identifier (ESI)", "mpeg_dsmcc.un_sess.dsmcc_nsap_esi", FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_dsmcc_un_sess_nsap_sel, { "Selector (SEL)", "mpeg_dsmcc.un_sess.dsmcc_nsap_sel", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } }, /* table J.3 NSAP - end */ { &hf_etv_module_abs_path, { "Module Absolute Path", "etv.dsmcc.dii.module_abs_path", FT_UINT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_etv_dii_authority, { "Authority", "etv.dsmcc.dii.authority", FT_UINT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } } /* table J.3 NSAP - end */ }; static gint *ett[] = { &ett_dsmcc, &ett_dsmcc_payload, &ett_dsmcc_adaptation_header, &ett_dsmcc_header, &ett_dsmcc_message_id, &ett_dsmcc_transaction_id, &ett_dsmcc_heading, &ett_dsmcc_rsrc_number, &ett_dsmcc_rsrc_association_tag, &ett_dsmcc_rsrc_flags, &ett_dsmcc_compat, &ett_dsmcc_compat_sub_desc, &ett_dsmcc_dii_module }; static ei_register_info ei[] = { { &ei_dsmcc_invalid_value, { "mpeg_dsmcc.invalid_value", PI_PROTOCOL, PI_WARN, "Invalid value", EXPFILL }}, { &ei_dsmcc_crc_invalid, { "mpeg_sect.crc.invalid", PI_CHECKSUM, PI_WARN, "Invalid CRC", EXPFILL }}, }; module_t *dsmcc_module; expert_module_t* expert_dsmcc; proto_dsmcc = proto_register_protocol("MPEG DSM-CC", "MPEG DSM-CC", "mpeg_dsmcc"); proto_register_field_array(proto_dsmcc, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); expert_dsmcc = expert_register_protocol(proto_dsmcc); expert_register_field_array(expert_dsmcc, ei, array_length(ei)); dsmcc_ts_handle = register_dissector("mp2t-dsmcc", dissect_dsmcc_ts, proto_dsmcc); dsmcc_tcp_handle = register_dissector("mp2t-dsmcc-tcp", dissect_dsmcc_tcp, proto_dsmcc); dsmcc_udp_handle = register_dissector("mp2t-dsmcc-udp", dissect_dsmcc_udp, proto_dsmcc); dsmcc_module = prefs_register_protocol(proto_dsmcc, NULL); prefs_register_bool_preference(dsmcc_module, "verify_crc", "Verify the section CRC or checksum", "Whether the section dissector should verify the CRC or checksum", &dsmcc_sect_check_crc); } void proto_reg_handoff_dsmcc(void) { dissector_add_uint("mpeg_sect.tid", DSMCC_TID_LLCSNAP, dsmcc_ts_handle); dissector_add_uint("mpeg_sect.tid", DSMCC_TID_UN_MSG, dsmcc_ts_handle); dissector_add_uint("mpeg_sect.tid", DSMCC_TID_DD_MSG, dsmcc_ts_handle); dissector_add_uint("mpeg_sect.tid", DSMCC_TID_DESC_LIST, dsmcc_ts_handle); /* TID 0x3E is used for both DSMCC_TID_PRIVATE and DVB_DATA_MPE_TID. * MPE (ETSI EN 301 192) is conformant to the DSSMCC section format * for private data, and is by far the most common implementation, * so default register it to the table entry. If someone wants this * generic DSM-CC dissector to handle it, they can use Decode As. * * dissector_add_uint("mpeg_sect.tid", DSMCC_TID_PRIVATE, dsmcc_ts_handle); */ dissector_add_uint_with_preference("tcp.port", DSMCC_TCP_PORT, dsmcc_tcp_handle); dissector_add_uint_with_preference("udp.port", DSMCC_UDP_PORT, dsmcc_udp_handle); } /* * Editor modelines - https://www.wireshark.org/tools/modelines.html * * Local variables: * c-basic-offset: 4 * tab-width: 8 * indent-tabs-mode: nil * End: * * vi: set shiftwidth=4 tabstop=8 expandtab: * :indentSize=4:tabSize=8:noTabs=true: */