summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-docsis-tlv.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-docsis-tlv.c
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-docsis-tlv.c')
-rw-r--r--epan/dissectors/packet-docsis-tlv.c8342
1 files changed, 8342 insertions, 0 deletions
diff --git a/epan/dissectors/packet-docsis-tlv.c b/epan/dissectors/packet-docsis-tlv.c
new file mode 100644
index 00000000..9b185349
--- /dev/null
+++ b/epan/dissectors/packet-docsis-tlv.c
@@ -0,0 +1,8342 @@
+/* packet-docsis-tlv.c
+ *
+ * Routines to Dissect Appendix C TLVs
+ * Copyright 2015, Adrian Simionov <daniel.simionov@gmail.com>
+ * Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
+ * Copyright 2017, Bruno Verstuyft <bruno.verstuyft@excentis.com>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include <epan/expert.h>
+#include <epan/reassemble.h>
+
+#include "packet-docsis-tlv.h"
+
+/* This module will dissect the Appendix C TLVs. Please see:
+ * http://www.cablemodem.com/specifications/specifications.html
+ *
+ * The main dissector is dissect_docsis_tlv. This routine will dissect
+ * top level TLVs and call sub-dissectors for the sub-TLVs.
+ */
+
+void proto_register_docsis_tlv(void);
+void proto_reg_handoff_docsis_tlv(void);
+
+/* Initialize the protocol and registered fields */
+static dissector_handle_t docsis_vsif_handle;
+static dissector_handle_t docsis_ucd_handle;
+static dissector_handle_t docsis_rba_handle;
+
+static int proto_docsis_tlv = -1;
+static int hf_docsis_tlv_down_freq = -1;
+static int hf_docsis_tlv_upstream_chid = -1;
+static int hf_docsis_tlv_net_access = -1;
+/* static int hf_docsis_tlv_cos = -1; */
+/* static int hf_docsis_tlv_mcap = -1; */
+static int hf_docsis_tlv_privacy_enable = -1;
+static int hf_docsis_tlv_max_cpe = -1;
+static int hf_docsis_tlv_max_classifiers = -1;
+static int hf_docsis_tlv_snmp_access = -1;
+static int hf_docsis_tlv_snmp_obj = -1;
+static int hf_docsis_tlv_svc_unavail = -1;
+static int hf_docsis_tlv_svc_unavail_classid = -1;
+static int hf_docsis_tlv_svc_unavail_type = -1;
+static int hf_docsis_tlv_svc_unavail_code = -1;
+static int hf_docsis_tlv_bpi = -1;
+/* static int hf_docsis_tlv_phs = -1; */
+static int hf_docsis_tlv_hmac_digest = -1;
+static int hf_docsis_tlv_tftp_server_timestamp = -1;
+static int hf_docsis_tlv_tftp_prov_modem_address = -1;
+/* static int hf_docsis_tlv_upclsfr = -1; */
+/* static int hf_docsis_tlv_downclsfr = -1; */
+/* static int hf_docsis_tlv_upsflow = -1; */
+/* static int hf_docsis_tlv_downsflow = -1; */
+/* static int hf_docsis_tlv_vendor_spec = -1; */
+static int hf_docsis_tlv_cm_mic = -1;
+static int hf_docsis_tlv_cmts_mic = -1;
+static int hf_docsis_tlv_auth_block = -1;
+static int hf_docsis_tlv_key_seq_num = -1;
+static int hf_docsis_tlv_snmpv3_kick = -1;
+static int hf_docsis_tlv_snmpv3_kick_name = -1;
+static int hf_docsis_tlv_snmpv3_kick_publicnum = -1;
+static int hf_docsis_tlv_mfgr_cvc = -1;
+static int hf_docsis_tlv_cosign_cvc = -1;
+static int hf_docsis_tlv_vendor_id = -1;
+static int hf_docsis_tlv_sw_file = -1;
+static int hf_docsis_tlv_sw_upg_srvr = -1;
+static int hf_docsis_tlv_cpe_ethernet = -1;
+static int hf_docsis_tlv_modem_addr = -1;
+static int hf_docsis_tlv_rng_tech = -1;
+static int hf_docsis_tlv_subs_mgmt_ctrl = -1;
+static int hf_docsis_tlv_subs_mgmt_ip_table = -1;
+static int hf_docsis_tlv_subs_mgmt_ip_entry = -1;
+static int hf_docsis_tlv_subs_mgmt_filter_grps = -1;
+static int hf_docsis_tlv_snmpv3_ntfy_rcvr = -1;
+static int hf_docsis_tlv_enable_20_mode = -1;
+static int hf_docsis_tlv_enable_test_modes = -1;
+/* static int hf_docsis_tlv_ds_ch_list = -1; */
+static int hf_docsis_tlv_mc_mac_address = -1;
+/* static int hf_docsis_tlv_dut_filter = -1; */
+/* static int hf_docsis_tlv_tcc = -1; */
+/* static int hf_docsis_tlv_sid_cl = -1; */
+/* static int hf_docsis_tlv_rcp = -1; */
+/* static int hf_docsis_tlv_rcc = -1; */
+/* static int hf_docsis_tlv_dsid = -1; */
+/* static int hf_docsis_tlv_sec_assoc = -1; */
+static int hf_docsis_tlv_init_ch_timeout = -1;
+/* static int hf_docsis_tlv_ch_asgn = -1; */
+static int hf_docsis_tlv_cm_init_reason = -1;
+static int hf_docsis_tlv_sw_upg_srvr_ipv6 = -1;
+static int hf_docsis_tlv_tftp_prov_cm_ipv6_addr = -1;
+static int hf_docsis_tlv_us_drop_clfy = -1;
+static int hf_docsis_tlv_subs_mgmt_ipv6_lst = -1;
+static int hf_docsis_tlv_us_drop_clfy_group_id = -1;
+static int hf_docsis_tlv_subs_mgmt_ctrl_max_cpe_ipv6 = -1;
+/* static int hf_docsis_tlv_cmts_mc_sess_enc = -1; */
+
+static int hf_docsis_tlv_cos_id = -1;
+static int hf_docsis_tlv_cos_sid = -1;
+static int hf_docsis_tlv_cos_max_down = -1;
+static int hf_docsis_tlv_cos_max_up = -1;
+static int hf_docsis_tlv_cos_up_chnl_pri = -1;
+static int hf_docsis_tlv_cos_min_grntd_up = -1;
+static int hf_docsis_tlv_cos_max_up_burst = -1;
+static int hf_docsis_tlv_cos_privacy_enable = -1;
+
+static int hf_docsis_tlv_mcap_concat = -1;
+static int hf_docsis_tlv_mcap_docs_ver = -1;
+static int hf_docsis_tlv_mcap_frag = -1;
+static int hf_docsis_tlv_mcap_phs = -1;
+static int hf_docsis_tlv_mcap_igmp = -1;
+static int hf_docsis_tlv_mcap_down_said = -1;
+static int hf_docsis_tlv_mcap_up_sid = -1;
+static int hf_docsis_tlv_mcap_privacy = -1;
+static int hf_docsis_tlv_mcap_8021P_filter = -1;
+static int hf_docsis_tlv_mcap_8021Q_filter = -1;
+static int hf_docsis_tlv_mcap_xmit_eq_taps_per_sym = -1;
+static int hf_docsis_tlv_mcap_xmit_eq_taps = -1;
+static int hf_docsis_tlv_mcap_dcc = -1;
+static int hf_docsis_tlv_mcap_ip_filters = -1;
+static int hf_docsis_tlv_mcap_llc_filters = -1;
+static int hf_docsis_tlv_mcap_exp_unicast_sid = -1;
+static int hf_docsis_tlv_mcap_rnghoff_cm = -1;
+static int hf_docsis_tlv_mcap_rnghoff_erouter = -1;
+static int hf_docsis_tlv_mcap_rnghoff_emta = -1;
+static int hf_docsis_tlv_mcap_rnghoff_estb = -1;
+static int hf_docsis_tlv_mcap_l2vpn = -1;
+static int hf_docsis_tlv_mcap_l2vpn_esafe = -1;
+static int hf_docsis_tlv_mcap_dut_filtering = -1;
+static int hf_docsis_tlv_mcap_us_freq_range = -1;
+static int hf_docsis_tlv_mcap_us_srate_160 = -1;
+static int hf_docsis_tlv_mcap_us_srate_320 = -1;
+static int hf_docsis_tlv_mcap_us_srate_640 = -1;
+static int hf_docsis_tlv_mcap_us_srate_1280 = -1;
+static int hf_docsis_tlv_mcap_us_srate_2560 = -1;
+static int hf_docsis_tlv_mcap_us_srate_5120 = -1;
+static int hf_docsis_tlv_mcap_sac = -1;
+static int hf_docsis_tlv_mcap_code_hop_mode2 = -1;
+static int hf_docsis_tlv_mcap_mtc = -1;
+static int hf_docsis_tlv_mcap_512_msps_utc = -1;
+static int hf_docsis_tlv_mcap_256_msps_utc = -1;
+static int hf_docsis_tlv_mcap_total_sid_cluster = -1;
+static int hf_docsis_tlv_mcap_sid_per_sf = -1;
+static int hf_docsis_tlv_mcap_mrc = -1;
+static int hf_docsis_tlv_mcap_total_dsid = -1;
+static int hf_docsis_tlv_mcap_reseq_dsid = -1;
+static int hf_docsis_tlv_mcap_mc_dsid = -1;
+static int hf_docsis_tlv_mcap_mc_dsid_fwd = -1;
+static int hf_docsis_tlv_mcap_fctype_fwd = -1;
+static int hf_docsis_tlv_mcap_dpv_path = -1;
+static int hf_docsis_tlv_mcap_dpv_packet = -1;
+static int hf_docsis_tlv_mcap_ugs = -1;
+static int hf_docsis_tlv_mcap_map_ucd = -1;
+static int hf_docsis_tlv_mcap_udc = -1;
+static int hf_docsis_tlv_mcap_ipv6 = -1;
+static int hf_docsis_tlv_mcap_ext_us_trans_power = -1;
+static int hf_docsis_tlv_mcap_em = -1;
+static int hf_docsis_tlv_mcap_em_1x1 = -1;
+static int hf_docsis_tlv_mcap_em_light_sleep = -1;
+static int hf_docsis_tlv_mcap_cm_status_ack = -1;
+static int hf_docsis_tlv_mcap_em_pref = -1;
+static int hf_docsis_tlv_mcap_em_pref_1x1 = -1;
+static int hf_docsis_tlv_mcap_em_pref_dls = -1;
+static int hf_docsis_tlv_mcap_ext_pkt_len_sup_cap = -1;
+static int hf_docsis_tlv_mcap_ofdm_mult_recv_chan_sup = -1;
+static int hf_docsis_tlv_mcap_ofdma_mult_trans_chan_sup = -1;
+static int hf_docsis_tlv_mcap_down_ofdm_prof_sup = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_reserved = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_qpsk = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16qam = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_64qam = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_128qam = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_256qam = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_512qam = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_1024qam = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_2048qam = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_4096qam = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_8192qam = -1;
+static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16384qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_reserved = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_qpsk = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_32qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_64qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_128qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_256qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_512qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_1024qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_2048qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_4096qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8192qam = -1;
+static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16384qam = -1;
+static int hf_docsis_tlv_mcap_down_lower_band_edge_conf = -1;
+static int hf_docsis_tlv_mcap_down_lower_band_edge_conf_108 = -1;
+static int hf_docsis_tlv_mcap_down_lower_band_edge_conf_258 = -1;
+static int hf_docsis_tlv_mcap_down_upper_band_edge_conf = -1;
+static int hf_docsis_tlv_mcap_down_upper_band_edge_conf_1218 = -1;
+static int hf_docsis_tlv_mcap_down_upper_band_edge_conf_1794 = -1;
+static int hf_docsis_tlv_mcap_down_upper_band_edge_conf_1002 = -1;
+static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_conf = -1;
+static int hf_docsis_tlv_mcap_docsis_time_prot_mode = -1;
+static int hf_docsis_tlv_mcap_docsis_time_prot_perf_sup = -1;
+static int hf_docsis_tlv_mcap_pmax = -1;
+static int hf_docsis_tlv_mcap_dipl_down_lower_band_edge = -1;
+static int hf_docsis_tlv_mcap_dipl_down_lower_band_edge_108 = -1;
+static int hf_docsis_tlv_mcap_dipl_down_lower_band_edge_258 = -1;
+static int hf_docsis_tlv_mcap_dipl_down_upper_band_edge = -1;
+static int hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1218 = -1;
+static int hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1794 = -1;
+static int hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1002 = -1;
+static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge = -1;
+static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_42 = -1;
+static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_65 = -1;
+static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_85 = -1;
+static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_117 = -1;
+static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_204 = -1;
+static int hf_docsis_tlv_mcap_advanced_band_plan = -1;
+static int hf_docsis_tlv_mcap_advanced_band_plan_fdx_l = -1;
+static int hf_docsis_tlv_mcap_advanced_band_plan_fdx = -1;
+static int hf_docsis_tlv_mcap_advanced_band_plan_fdd = -1;
+static int hf_docsis_tlv_mcap_advanced_band_plan_reserved = -1;
+static int hf_docsis_tlv_mcap_ext_sf_cluster_assign_sup = -1;
+static int hf_docsis_tlv_mcap_low_latency_sup = -1;
+static int hf_docsis_tlv_mcap_adv_down_lower_band_edge_conf = -1;
+static int hf_docsis_tlv_mcap_adv_down_upper_band_edge_conf = -1;
+static int hf_docsis_tlv_mcap_adv_up_upper_band_edge_conf = -1;
+static int hf_docsis_tlv_mcap_adv_down_lower_band_edge_option = -1;
+static int hf_docsis_tlv_mcap_adv_down_upper_band_edge_option = -1;
+static int hf_docsis_tlv_mcap_adv_up_upper_band_edge_option = -1;
+static int hf_docsis_tlv_mcap_extended_power_options = -1;
+
+static int hf_docsis_tlv_clsfr_ref = -1;
+static int hf_docsis_tlv_clsfr_id = -1;
+static int hf_docsis_tlv_clsfr_sflow_ref = -1;
+static int hf_docsis_tlv_clsfr_sflow_id = -1;
+static int hf_docsis_tlv_clsfr_rule_pri = -1;
+static int hf_docsis_tlv_clsfr_act_state = -1;
+static int hf_docsis_tlv_clsfr_dsc_act = -1;
+/* static int hf_docsis_tlv_clsfr_err = -1; */
+/* static int hf_docsis_tlv_ipclsfr = -1; */
+/* static int hf_docsis_tlv_ethclsfr = -1; */
+/* static int hf_docsis_tlv_dot1qclsfr = -1; */
+
+static int hf_docsis_tlv_clsfr_vendor_spc = -1;
+
+static int hf_docsis_tlv_clsfr_err_param = -1;
+static int hf_docsis_tlv_clsfr_err_code = -1;
+static int hf_docsis_tlv_clsfr_err_msg = -1;
+
+static int hf_docsis_tlv_ipclsfr_tosmask = -1;
+static int hf_docsis_tlv_ipclsfr_ipproto = -1;
+static int hf_docsis_tlv_ipclsfr_src = -1;
+static int hf_docsis_tlv_ipclsfr_dst = -1;
+static int hf_docsis_tlv_ipclsfr_srcmask = -1;
+static int hf_docsis_tlv_ipclsfr_dstmask = -1;
+static int hf_docsis_tlv_ipclsfr_sport_start = -1;
+static int hf_docsis_tlv_ipclsfr_sport_end = -1;
+static int hf_docsis_tlv_ipclsfr_dport_start = -1;
+static int hf_docsis_tlv_ipclsfr_dport_end = -1;
+
+static int hf_docsis_tlv_ip6clsfr_tc_low = -1;
+static int hf_docsis_tlv_ip6clsfr_tc_high = -1;
+static int hf_docsis_tlv_ip6clsfr_tc_mask = -1;
+static int hf_docsis_tlv_ip6clsfr_flow_label = -1;
+static int hf_docsis_tlv_ip6clsfr_next_header = -1;
+static int hf_docsis_tlv_ip6clsfr_src = -1;
+static int hf_docsis_tlv_ip6clsfr_src_prefix_length = -1;
+static int hf_docsis_tlv_ip6clsfr_dst = -1;
+static int hf_docsis_tlv_ip6clsfr_dst_prefix_length = -1;
+
+static int hf_docsis_tlv_ethclsfr_dmac = -1;
+static int hf_docsis_tlv_ethclsfr_smac = -1;
+static int hf_docsis_tlv_ethclsfr_ethertype = -1;
+
+static int hf_docsis_tlv_dot1qclsfr_user_pri = -1;
+static int hf_docsis_tlv_dot1qclsfr_vlanid = -1;
+static int hf_docsis_tlv_dot1qclsfr_vendorspec = -1;
+
+static int hf_docsis_tlv_sflow_ref = -1;
+static int hf_docsis_tlv_sflow_id = -1;
+static int hf_docsis_tlv_sflow_sid = -1;
+static int hf_docsis_tlv_sflow_classname = -1;
+static int hf_docsis_tlv_sflow_qos_param = -1;
+/* static int hf_docsis_tlv_sflow_err = -1; */
+static int hf_docsis_tlv_sflow_traf_pri = -1;
+static int hf_docsis_tlv_sflow_max_sus = -1;
+static int hf_docsis_tlv_sflow_max_burst = -1;
+static int hf_docsis_tlv_sflow_min_traf = -1;
+static int hf_docsis_tlv_sflow_ass_min_pkt_size = -1;
+static int hf_docsis_tlv_sflow_timeout_active = -1;
+static int hf_docsis_tlv_sflow_timeout_admitted = -1;
+static int hf_docsis_tlv_sflow_peak_traffic_rate = -1;
+static int hf_docsis_tlv_sflow_req_attr_mask = -1;
+static int hf_docsis_tlv_sflow_forb_attr_mask = -1;
+static int hf_docsis_tlv_sflow_attr_aggr_rule_mask = -1;
+static int hf_docsis_tlv_sflow_vendor_spec = -1;
+static int hf_docsis_tlv_sflow_max_concat_burst = -1;
+static int hf_docsis_tlv_sflow_sched_type = -1;
+static int hf_docsis_tlv_sflow_reqxmit_pol = -1;
+static int hf_docsis_tlv_sflow_reqxmit_all_cm_broadcast = -1;
+static int hf_docsis_tlv_sflow_reqxmit_priority_multicast = -1;
+static int hf_docsis_tlv_sflow_reqxmit_req_data_requests = -1;
+static int hf_docsis_tlv_sflow_reqxmit_req_data_data = -1;
+static int hf_docsis_tlv_sflow_reqxmit_piggy_back = -1;
+static int hf_docsis_tlv_sflow_reqxmit_concatenate_data = -1;
+static int hf_docsis_tlv_sflow_reqxmit_fragment = -1;
+static int hf_docsis_tlv_sflow_reqxmit_suppress_payload = -1;
+static int hf_docsis_tlv_sflow_reqxmit_drop_packets = -1;
+static int hf_docsis_tlv_sflow_nominal_polling = -1;
+static int hf_docsis_tlv_sflow_tolerated_jitter = -1;
+static int hf_docsis_tlv_sflow_ugs_size = -1;
+static int hf_docsis_tlv_sflow_nom_grant_intvl = -1;
+static int hf_docsis_tlv_sflow_tol_grant_jitter = -1;
+static int hf_docsis_tlv_sflow_grants_per_intvl = -1;
+static int hf_docsis_tlv_sflow_ip_tos_overwrite = -1;
+static int hf_docsis_tlv_sflow_ugs_timeref = -1;
+static int hf_docsis_tlv_sflow_cont_req_backoff_window_mult = -1;
+static int hf_docsis_tlv_sflow_num_of_bytes_requested_mult = -1;
+static int hf_docsis_tlv_sflow_max_down_latency = -1;
+static int hf_docsis_tlv_sflow_down_reseq = -1;
+
+static int hf_docsis_tlv_sflow_err_param = -1;
+static int hf_docsis_tlv_sflow_err_code = -1;
+static int hf_docsis_tlv_sflow_err_msg = -1;
+
+static int hf_docsis_tlv_phs_class_ref = -1;
+static int hf_docsis_tlv_phs_class_id = -1;
+static int hf_docsis_tlv_phs_sflow_ref = -1;
+static int hf_docsis_tlv_phs_sflow_id = -1;
+static int hf_docsis_tlv_phs_dsc_action = -1;
+/* static int hf_docsis_tlv_phs_err = -1; */
+static int hf_docsis_tlv_phs_phsf = -1;
+static int hf_docsis_tlv_phs_phsm = -1;
+/* static int hf_docsis_tlv_phs_phsv = -1; */
+static int hf_docsis_tlv_phs_phsi = -1;
+static int hf_docsis_tlv_phs_phss = -1;
+static int hf_docsis_tlv_phs_dbc_action = -1;
+static int hf_docsis_tlv_phs_vendorspec = -1;
+
+static int hf_docsis_tlv_phs_err_param = -1;
+static int hf_docsis_tlv_phs_err_code = -1;
+static int hf_docsis_tlv_phs_err_msg = -1;
+
+/* static int hf_docsis_tlv_ds_ch_list_single = -1; */
+/* static int hf_docsis_tlv_ds_ch_list_range = -1; */
+static int hf_docsis_tlv_ds_ch_list_default_timeout = -1;
+
+static int hf_docsis_tlv_single_ch_timeout = -1;
+static int hf_docsis_tlv_single_ch_freq = -1;
+
+static int hf_docsis_tlv_freq_rng_timeout = -1;
+static int hf_docsis_tlv_freq_rng_start = -1;
+static int hf_docsis_tlv_freq_rng_end = -1;
+static int hf_docsis_tlv_freq_rng_step = -1;
+
+static int hf_docsis_tlv_dut_filter_control = -1;
+static int hf_docsis_tlv_dut_filter_cmim = -1;
+
+static int hf_docsis_tlv_tcc_refid = -1;
+static int hf_docsis_tlv_tcc_us_ch_action= -1;
+static int hf_docsis_tlv_tcc_us_ch_id= -1;
+static int hf_docsis_tlv_tcc_new_us_ch_id= -1;
+static int hf_docsis_tlv_tcc_ucd = -1;
+static int hf_docsis_tlv_tcc_rng_sid= -1;
+static int hf_docsis_tlv_tcc_init_tech= -1;
+/* static int hf_docsis_tlv_tcc_rng_parms= -1; */
+static int hf_docsis_tlv_tcc_dyn_rng_win= -1;
+static int hf_docsis_tlv_tcc_p_16hi = -1;
+static int hf_docsis_tlv_tcc_oudp_iuc = -1;
+static int hf_docsis_tlv_tcc_extended_drw = -1;
+static int hf_docsis_tlv_tcc_extended_us_rng_pwr = -1;
+static int hf_docsis_tlv_tcc_oudp_sounding_sid = -1;
+/* static int hf_docsis_tlv_tcc_err = -1; */
+
+static int hf_docsis_rng_parms_us_ch_id = -1;
+static int hf_docsis_rng_parms_time_off_int = -1;
+static int hf_docsis_rng_parms_time_off_frac = -1;
+static int hf_docsis_rng_parms_power_off = -1;
+static int hf_docsis_rng_parms_freq_off = -1;
+
+static int hf_docsis_tcc_err_subtype = -1;
+static int hf_docsis_tcc_err_code = -1;
+static int hf_docsis_tcc_err_msg = -1;
+
+static int hf_docsis_sid_cl_sf_id = -1;
+/* static int hf_docsis_sid_cl_enc = -1; */
+/* static int hf_docsis_sid_cl_so_crit = -1; */
+
+static int hf_docsis_sid_cl_enc_id = -1;
+/* static int hf_docsis_sid_cl_enc_map = -1; */
+
+static int hf_docsis_sid_cl_map_us_ch_id = -1;
+static int hf_docsis_sid_cl_map_sid = -1;
+static int hf_docsis_sid_cl_map_action = -1;
+
+static int hf_docsis_sid_cl_so_max_req = -1;
+static int hf_docsis_sid_cl_so_max_out_bytes = -1;
+static int hf_docsis_sid_cl_so_max_req_bytes = -1;
+static int hf_docsis_sid_cl_so_max_time = -1;
+
+static int hf_docsis_tlv_rcp_id = -1;
+static int hf_docsis_tlv_rcp_name = -1;
+static int hf_docsis_tlv_rcp_freq_spc = -1;
+/* static int hf_docsis_tlv_rcp_rcv_mod_enc = -1; */
+/* static int hf_docsis_tlv_rcp_rcv_ch = -1; */
+/* static int hf_docsis_tlv_rcp_ven_spec = -1; */
+
+static int hf_docsis_rcv_mod_enc_idx = -1;
+static int hf_docsis_rcv_mod_enc_adj_ch = -1;
+/* static int hf_docsis_rcv_mod_enc_ch_bl_rng = -1; */
+static int hf_docsis_rcv_mod_enc_ctr_freq_asgn = -1;
+static int hf_docsis_rcv_mod_enc_rsq_ch_subs_cap = -1;
+static int hf_docsis_rcv_mod_enc_conn = -1;
+static int hf_docsis_rcv_mod_enc_phy_layr_parms = -1;
+
+static int hf_docsis_rcc_rcv_mod_enc_idx = -1;
+static int hf_docsis_rcc_rcv_mod_enc_ctr_freq_asgn = -1;
+static int hf_docsis_rcc_rcv_mod_enc_conn = -1;
+
+static int hf_docsis_ch_bl_rng_min_ctr_freq = -1;
+static int hf_docsis_ch_bl_rng_max_ctr_freq = -1;
+
+static int hf_docsis_rcv_ch_idx = -1;
+static int hf_docsis_rcv_ch_conn = -1;
+static int hf_docsis_rcv_ch_conn_off = -1;
+static int hf_docsis_rcv_ch_prim_ds_ch_ind = -1;
+
+static int hf_docsis_rcc_rcv_ch_idx = -1;
+static int hf_docsis_rcc_rcv_ch_conn = -1;
+static int hf_docsis_rcc_rcv_ch_ctr_freq_asgn = -1;
+static int hf_docsis_rcc_rcv_ch_prim_ds_ch_ind = -1;
+
+static int hf_docsis_tlv_rcc_id = -1;
+static int hf_docsis_tlv_rcc_partial_serv_down_chan_id = -1;
+static int hf_docsis_tlv_rcc_srcc_prim_ds_chan_assign_ds_ch_id = -1;
+static int hf_docsis_tlv_rcc_srcc_ds_chan_assign_ds_ch_id = -1;
+static int hf_docsis_tlv_rcc_srcc_ds_prof_assign_dcid = -1;
+static int hf_docsis_tlv_rcc_srcc_ds_prof_asssign_prof_list_prof_id = -1;
+static int hf_docsis_tlv_rcc_prim_down_chan = -1;
+/* static int hf_docsis_tlv_rcc_rcv_mod_enc = -1; */
+/* static int hf_docsis_tlv_rcc_rcv_ch = -1; */
+/* static int hf_docsis_tlv_rcc_part_serv_ds_ch = -1; */
+/* static int hf_docsis_tlv_rcc_ven_spec = -1; */
+/* static int hf_docsis_tlv_rcc_err = -1; */
+
+static int hf_docsis_tlv_rcc_err_mod_or_ch = -1;
+static int hf_docsis_tlv_rcc_err_idx = -1;
+static int hf_docsis_tlv_rcc_err_param = -1;
+static int hf_docsis_tlv_rcc_err_code = -1;
+static int hf_docsis_tlv_rcc_err_msg = -1;
+
+static int hf_docsis_tlv_dsid_id = -1;
+static int hf_docsis_tlv_dsid_action = -1;
+/* static int hf_docsis_tlv_dsid_ds_reseq = -1; */
+/* static int hf_docsis_tlv_dsid_mc = -1; */
+
+static int hf_docsis_ds_reseq_dsid = -1;
+static int hf_docsis_ds_reseq_ch_lst = -1;
+static int hf_docsis_ds_reseq_wait_time = -1;
+static int hf_docsis_ds_reseq_warn_thresh = -1;
+static int hf_docsis_ds_reseq_ho_timer = -1;
+
+/* static int hf_docsis_tlv_dsid_mc_addr = -1; */
+static int hf_docsis_tlv_dsid_mc_cmim = -1;
+static int hf_docsis_tlv_dsid_mc_group = -1;
+/* static int hf_docsis_tlv_dsid_mc_phs = -1; */
+
+static int hf_docsis_mc_addr_action = -1;
+static int hf_docsis_mc_addr_addr = -1;
+
+static int hf_docsis_tlv_sec_assoc_action = -1;
+static int hf_docsis_tlv_sec_assoc_desc = -1;
+
+static int hf_docsis_ch_asgn_us_ch_id = -1;
+static int hf_docsis_ch_asgn_rx_freq = -1;
+
+static int hf_docsis_cmts_mc_sess_enc_grp = -1;
+static int hf_docsis_cmts_mc_sess_enc_src = -1;
+static int hf_docsis_cmts_mc_sess_enc_cmim = -1;
+
+static int hf_docsis_tlv_em_mode_ind = -1;
+
+static int hf_docsis_tlv_em_id_list_for_cm_em_id = -1;
+
+static int hf_docsis_tlv_fdx_reset = -1;
+
+static int hf_docsis_tlv_fdx_tg_assignment_tg_id = -1;
+static int hf_docsis_tlv_fdx_tg_assignment_rba_type = -1;
+
+static int hf_docsis_tlv_unknown = -1;
+static int hf_docsis_tlv_unknown_type = -1;
+static int hf_docsis_tlv_unknown_length = -1;
+static int hf_docsis_tlv_unknown_value = -1;
+
+
+static int hf_docsis_ucd_fragments = -1;
+static int hf_docsis_ucd_fragment = -1;
+static int hf_docsis_ucd_fragment_overlap = -1;
+static int hf_docsis_ucd_fragment_overlap_conflict = -1;
+static int hf_docsis_ucd_fragment_multiple_tails = -1;
+static int hf_docsis_ucd_fragment_too_long_fragment = -1;
+static int hf_docsis_ucd_fragment_error = -1;
+static int hf_docsis_ucd_fragment_count = -1;
+static int hf_docsis_ucd_reassembled_in = -1;
+static int hf_docsis_ucd_reassembled_length = -1;
+static int hf_docsis_ucd_reassembled_data = -1;
+
+static int hf_docsis_ucd_reassembled = -1;
+
+
+/* Initialize the subtree pointers */
+static gint ett_docsis_tlv = -1;
+static gint ett_docsis_tlv_cos = -1;
+static gint ett_docsis_tlv_mcap = -1;
+static gint ett_docsis_tlv_mcap_em = -1;
+static gint ett_docsis_tlv_mcap_em_pref = -1;
+static gint ett_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup = -1;
+static gint ett_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup = -1;
+static gint ett_docsis_tlv_mcap_down_lower_band_edge_conf = -1;
+static gint ett_docsis_tlv_mcap_down_upper_band_edge_conf = -1;
+static gint ett_docsis_tlv_mcap_dipl_down_lower_band_edge = -1;
+static gint ett_docsis_tlv_mcap_dipl_down_upper_band_edge = -1;
+static gint ett_docsis_tlv_mcap_dipl_up_upper_band_edge = -1;
+static gint ett_docsis_tlv_mcap_advanced_band_plan = -1;
+static gint ett_docsis_tlv_mcap_dipl_down_lower_band_edge_options_list = -1;
+static gint ett_docsis_tlv_mcap_dipl_down_upper_band_edge_options_list = -1;
+static gint ett_docsis_tlv_mcap_dipl_up_upper_band_edge_options_list = -1;
+static gint ett_docsis_tlv_clsfr = -1;
+static gint ett_docsis_tlv_clsfr_ip = -1;
+static gint ett_docsis_tlv_clsfr_ip6 = -1;
+static gint ett_docsis_tlv_clsfr_ip6_tc = -1;
+static gint ett_docsis_tlv_clsfr_eth = -1;
+static gint ett_docsis_tlv_clsfr_err = -1;
+static gint ett_docsis_tlv_phs = -1;
+static gint ett_docsis_tlv_phs_err = -1;
+static gint ett_docsis_tlv_clsfr_dot1q = -1;
+static gint ett_docsis_tlv_reqxmitpol = -1;
+static gint ett_docsis_tlv_sflow_err = -1;
+static gint ett_docsis_tlv_svc_unavail = -1;
+static gint ett_docsis_tlv_snmpv3_kick = -1;
+static gint ett_docsis_tlv_ds_ch_list = -1;
+static gint ett_docsis_tlv_ds_ch_list_single = -1;
+static gint ett_docsis_tlv_ds_ch_list_range = -1;
+static gint ett_docsis_tlv_ext_field = -1;
+static gint ett_docsis_tlv_vendor_specific_cap = -1;
+static gint ett_docsis_tlv_dut_filter = -1;
+static gint ett_docsis_tlv_tcc = -1;
+static gint ett_docsis_tlv_tcc_ucd = -1;
+static gint ett_docsis_tlv_tcc_rng_parms = -1;
+static gint ett_docsis_tlv_tcc_oudp = -1;
+static gint ett_docsis_tlv_tcc_err = -1;
+static gint ett_docsis_tlv_sid_cl = -1;
+static gint ett_docsis_tlv_sid_cl_enc = -1;
+static gint ett_docsis_tlv_sid_cl_enc_map = -1;
+static gint ett_docsis_tlv_sid_cl_so = -1;
+static gint ett_docsis_tlv_rcp = -1;
+static gint ett_docsis_tlv_rcp_rcv_mod_enc = -1;
+static gint ett_docsis_tlv_rcp_ch_bl_rng = -1;
+static gint ett_docsis_tlv_rcp_rcv_ch = -1;
+static gint ett_docsis_tlv_rcc = -1;
+static gint ett_docsis_tlv_rcc_rcv_mod_enc = -1;
+static gint ett_docsis_tlv_rcc_rcv_ch = -1;
+static gint ett_docsis_tlv_rcc_partial_serv_down_chan = -1;
+static gint ett_docsis_tlv_rcc_srcc = -1;
+static gint ett_docsis_tlv_rcc_srcc_prim_ds_assign = -1;
+static gint ett_docsis_tlv_rcc_srcc_ds_assign = -1;
+static gint ett_docsis_tlv_rcc_srcc_ds_prof_assign = -1;
+static gint ett_docsis_tlv_rcc_srcc_ds_prof_assign_prof_list = -1;
+static gint ett_docsis_tlv_rcc_err = -1;
+static gint ett_docsis_tlv_dsid = -1;
+static gint ett_docsis_tlv_dsid_ds_reseq = -1;
+static gint ett_docsis_tlv_dsid_mc = -1;
+static gint ett_docsis_tlv_dsid_mc_addr = -1;
+static gint ett_docsis_tlv_sec_assoc = -1;
+static gint ett_docsis_tlv_ch_asgn = -1;
+static gint ett_docsis_cmts_mc_sess_enc = -1;
+static gint ett_docsis_em_id_list_for_cm = -1;
+static gint ett_docsis_tlv_tg_assignment = -1;
+static gint ett_docsis_tlv_unknown = -1;
+static gint ett_docsis_ucd_fragments = -1;
+static gint ett_docsis_ucd_fragment = -1;
+static gint ett_docsis_ucd_reassembled = -1;
+
+
+static expert_field ei_docsis_tlv_tlvlen_bad = EI_INIT;
+static expert_field ei_docsis_tlv_tlvval_bad = EI_INIT;
+
+
+static const true_false_string ena_dis_tfs = {
+ "Enable",
+ "Disable"
+};
+
+static const value_string sup_unsup_vals[] = {
+ {0, "Unsupported"},
+ {1, "Supported"},
+ {0, NULL},
+};
+
+static const true_false_string sup_unsup_tfs = {
+ "Supported",
+ "Unsupported"
+};
+
+static const value_string docs_ver_vals[] = {
+ {0, "v1.0"},
+ {1, "v1.1"},
+ {2, "v2.0"},
+ {3, "v3.0"},
+ {4, "v3.1"},
+ {5, "v4.0"},
+ {0, NULL},
+};
+
+static const value_string dsc_act_vals[] = {
+ {0, "DSC Add Classifier"},
+ {1, "DSC Replace Classifier"},
+ {2, "DSC Delete Classifier"},
+ {0, NULL},
+};
+
+static const value_string qos_param_vals[] = {
+ {0x01, "Apply to provisioned set only"},
+ {0x02, "Perform admission control add apply to admitted set"},
+ {0x03, "Apply to provisioned and admitted set; Perform admission control"},
+ {0x04, "Perform admission control if needed and apply to active set"},
+ {0x05,
+ "Apply to provisioned and active sets; Admission control on admitted set in separate service flow, and activate service flow"},
+ {0x06,
+ "Perform admission control and activate; Apply to admitted and active sets"},
+ {0x07,
+ "Apply to Provisioned, Active and Admitted Sets; Admission Control and Activate Service Flow"},
+ {0, NULL},
+};
+
+static const value_string sched_type_vals[] = {
+ {0, "Reserved"},
+ {1, "Undefined (CMTS Dependent)"},
+ {2, "Best Effort Service"},
+ {3, "Non-Real-Time Polling Service"},
+ {4, "Real-Time Polling Service"},
+ {5, "Unsolicited Grant Service w/Activity Detection"},
+ {6, "Unsolicited Grant Service"},
+ {0, NULL},
+};
+
+static const value_string action_vals[] = {
+ {0, "Add PHS Rule"},
+ {1, "Set PHS Rule"},
+ {2, "Delete PHS Rule"},
+ {3, "Delete all PHS Rules"},
+ {0, NULL},
+};
+
+static const value_string dbc_action_vals[] = {
+ {0, "Add PHS Rule"},
+ {1, "Delete PHS Rule"},
+ {0, NULL},
+};
+
+#if 0
+static const true_false_string verify_tfs = {
+ "Don't Verify",
+ "Verify"
+};
+#endif
+
+static const value_string rng_tech_vals[] = {
+ {0, "Perform initial maintenance on new channel"},
+ {1, "Perform only station maintenance on new channel"},
+ {2, "Perform either initial maintenance or station maintenance on new channel"},
+ {3, "Use the new channel directly without performing initial or station maintenance"},
+ {0, NULL},
+};
+
+
+const value_string docsis_conf_code[] = {
+ { 0, "okay/success"},
+ { 1, "Reject: Other/Auth failure (1.0)"},
+ { 2, "Reject: Unrecognized configuration setting/COS failure (1.0)"},
+ { 3, "Reject: Temporary/Reject resource"},
+ { 4, "Reject: Permanent/Reject admin"},
+ { 5, "Reject: Not owner"},
+ { 6, "Reject: Service flow not found"},
+ { 7, "Reject: Service flow exists"},
+ { 8, "Reject: Required parameter not present"},
+ { 9, "Reject: Header suppression"},
+ { 10, "Reject: Unknown transaction ID"},
+ { 11, "Reject: Authentication failure"},
+ { 12, "Reject: Add aborted"},
+ { 13, "Reject: Multiple errors"},
+ { 14, "Reject: Classifier not found"},
+ { 15, "Reject: Classifier exists"},
+ { 16, "Reject: PHS rule not found"},
+ { 17, "Reject: PHS rule exists"},
+ { 18, "Reject: Duplicate reference ID or index in message"},
+ { 19, "Reject: Multiple upstream service flows"},
+ { 20, "Reject: Multiple downstream service flows"},
+ { 21, "Reject: Classifier for another service flow"},
+ { 22, "Reject: PHS for another service flow"},
+ { 23, "Reject: Parameter invalid for context"},
+ { 24, "Reject: Authorization failure"},
+ { 25, "Reject: Temporary DCC"},
+ { 26, "Reject: Downstream Inconsistency"},
+ { 27, "Reject: Upstream Inconsistency"},
+ { 28, "Reject: Insufficient SID Cluster Resources"},
+ { 29, "Reject: Missing RCP"},
+ { 30, "Partial Service"},
+ { 31, "Reject: Temporary DBC"},
+ { 32, "Reject: Unknown DSID"},
+ { 33, "Reject: Unknown SID Cluster"},
+ { 34, "Reject: Invalid Initialization Technique"},
+ { 35, "Reject: No Change"},
+ { 36, "Reject: Invalid DBC Request"},
+ { 37, "Reject: Mode Switch"},
+ { 38, "Reject: Insufficient Transmitters"},
+ { 40, "Reject: Insufficient DSID Resources"},
+ { 41, "Reject: Invalid DSID Encoding"},
+ { 42, "Reject: Unknown Client MAC Address"},
+ { 43, "Reject: Unknown SAID"},
+ { 44, "Reject: Insufficient SA Resources"},
+ { 45, "Reject: Invalid SA Encoding"},
+ { 46, "Reject: Invalid SA Crypto Suite"},
+ { 47, "Reject: TEK Exists"},
+ { 48, "Reject: Invalid SID Cluster Encoding"},
+ { 49, "Reject: Insufficient SID Resources"},
+ { 50, "Reject: Unsupported Parameter Change"},
+ { 51, "Reject: PHS Rule Fully Defined"},
+ { 52, "Reject: No MAPs Or UCDs"},
+ { 53, "Error: T3 Retries Exceeded"},
+ { 54, "Error: T2 Timeout"},
+ { 55, "Error: T4 Timeout"},
+ { 56, "Error: Ranging Abort"},
+ { 57, "Error: Initialization Channel Timeout"},
+ { 58, "Error: DBC-REQ Incomplete"},
+ { 59, "Reject: Too Many OFDMA Profiles"},
+ { 60, "Reject: Too Many OFDM Profiles"},
+ { 61, "Reject: EM Incorrect Primary DS"},
+ { 62, "Reject: AQM Not Supported"},
+ { 63, "Reject: Invalid DPD"},
+ {100, "Reject: VLAD ID In Use"},
+ {101, "Reject: Multipoint L2VPN"},
+ {102, "Reject: Multipoint NSI"},
+ {160, "Reject: Unknown RCP ID"},
+ {161, "Reject: Multiple RCP IDs"},
+ {162, "Reject: Missing Receive Module Index"},
+ {163, "Reject: Invalid Receive Module Index"},
+ {164, "Reject: Invalid Receive Channel Center Frequency"},
+ {165, "Reject: Invalid Receive Module First Channel Center Frequency"},
+ {166, "Reject: Missing Receive Module First Channel Center Frequency"},
+ {167, "Reject: No Primary Downstream Channel Assigned"},
+ {168, "Reject: Multiple Primary Downstream Channel Assigned"},
+ {169, "Reject: Receive Module Connectivity Error"},
+ {170, "Reject: Invalid Receive Channel Index"},
+ {171, "Reject: Center Frequency Not Multiple of 62500 Hz"},
+ {180, "Depart"},
+ {181, "Arrive"},
+ {182, "Reject: Already There"},
+ {183, "Reject: Reject 2.0 Disable"},
+ {200, "Reject: Major Service Flow Error"},
+ {201, "Reject: Major Classifier Error"},
+ {202, "Reject: Major PHS Rule Error"},
+ {203, "Reject: Multiple Major Errors"},
+ {204, "Reject: Message Syntax Error"},
+ {205, "Reject: Primary Service Flow Error"},
+ {206, "Reject: Message Too Big"},
+ {207, "Reject: Invalid Modem Capabilities"},
+ {208, "Reject: Bad RCC"},
+ {209, "Reject: Bad TCC"},
+ {210, "Reject: Dynamic Range Window Violation"},
+ {211, "Reject: Unable to support Queue Depth"},
+ {212, "Reject: Energy Management Parameters"},
+ {213, "Reject: Invalid Backup Primary Downstream"},
+ {0, NULL}
+};
+
+value_string_ext docsis_conf_code_ext = VALUE_STRING_EXT_INIT(docsis_conf_code);
+
+static const value_string next_header_vals[] = {
+ {0, "Hop-by-Hop"},
+ {60, "Destination"},
+ {43, "Routing"},
+ {44, "Fragment"},
+ {51, "Authentication"},
+ {50, "Encapsulation"},
+ {59, "No"},
+ {256, "All IPv6 Traffic"},
+ {257, "All UDP and TCP Traffic"},
+ {0, NULL},
+};
+
+static const value_string us_ch_action_vals[] = {
+ {0, "No Action"},
+ {1, "Add"},
+ {2, "Change"},
+ {3, "Delete"},
+ {4, "Replace"},
+ {5, "Re-range"},
+ {0, NULL},
+};
+
+static const value_string init_tech_vals[] = {
+ {0, "reserved"},
+ {1, "Perform broadcast initial ranging before normal ops"},
+ {2, "Perform unicast ranging before normal ops"},
+ {3, "Perform either broadcast or unicast ranging before normal ops"},
+ {4, "Use new channel directly without reinitializing or ranging"},
+ {5, "Perform probing before normal ops"},
+ {6, "Perform unicast initial ranging before normal ops"},
+ {7, "Perform station ranging before normal ops"},
+ {8, "Use FDX channel directly"},
+ {0, NULL},
+};
+
+static const value_string sid_ch_map_vals[] = {
+ {0, "reserved"},
+ {1, "Add"},
+ {2, "Delete"},
+ {0, NULL},
+};
+
+static const value_string mod_or_ch_vals[] = {
+ {0, "reserved"},
+ {1, "reserved"},
+ {2, "reserved"},
+ {3, "reserved"},
+ {4, "Receive Module"},
+ {5, "Receive Channel"},
+ {0, NULL},
+};
+
+static const value_string dsid_action_vals[] = {
+ {0, "Add"},
+ {1, "Change"},
+ {2, "Delete"},
+ {0, NULL},
+};
+
+static const value_string add_del_vals[] = {
+ {0, "Add"},
+ {1, "Delete"},
+ {0, NULL},
+};
+
+static const value_string init_reason_vals[] = {
+ { 0, "reserved"},
+ { 1, "Power On"},
+ { 2, "T17 Lost Sync"},
+ { 3, "All Upstream Failed"},
+ { 4, "Bad DHCP Ack"},
+ { 5, "Link Local Address in use"},
+ { 6, "T6 Expired"},
+ { 7, "REG-RSP not ok"},
+ { 8, "BAD RCC/TCC"},
+ { 9, "Failed Primary Downstream"},
+ {10, "TCS failed on all upstreams"},
+ {11, "reserved"},
+ {12, "reserved"},
+ {13, "reserved"},
+ {14, "reserved"},
+ {15, "MTCM Change"},
+ {16, "T4 Expired"},
+ {17, "No Primary SF on US Channel"},
+ {18, "CM Control Init"},
+ {19, "Dynamic Range Window Violation"},
+ {20, "IP Provisioning Mode Override"},
+ {21, "SW Upgrade Reboot"},
+ {22, "SNMP Reset"},
+ {23, "REG-RSP Missing RCC"},
+ {24, "REG-RSP Missing TCC"},
+ {25, "REG-RSP MTC Not Enabled"},
+ {26, "DHCPv6 Bad Reply"},
+ {27, "Reset Due To Diplexer Change"},
+ {0, NULL},
+};
+
+static const value_string docsis_freq_rng_vals[] = {
+ {0, "Standard Upstream Frequency Range (5-42 MHz)"},
+ {1, "Selectable Between Standard (5-42 MHz) and Extended (5-85 MHz) Upstream Frequency Range"},
+ {2, "Extended Upstream Frequency Range (5-85 MHz)"},
+ {0, NULL},
+};
+
+static const value_string mc_dsid_fwd_vals[] = {
+ {0, "No support for multicast DSID forwarding"},
+ {1, "Support for GMAC explicit multicast DSID forwarding"},
+ {2, "Support for GMAC promiscuous multicast DSID forwarding"},
+ {0, NULL},
+};
+
+static const value_string fctype_fwd_vals[] = {
+ {0, "Isolation Packet PDU Header (FC_Type of 10) is not forwarded"},
+ {1, "Isolation Packet PDU Header (FC_Type of 10) is forwarded"},
+ {0, NULL},
+};
+
+static const value_string em_mode_ind_vals[] = {
+ {0, "Do not operate in any Energy Management Mode"},
+ {1, "Operate in Energy Management 1x1 Mode"},
+ {2, "Operate in DOCSIS Light Sleep (DLS) Mode"},
+ {0, NULL},
+};
+
+static const value_string down_reseq_vals[] = {
+ {0, "The CMTS is required to associate this service flow with a resequencing DSID if the service flow is assigned to a downstream bonding group."},
+ {1, "The CMTS is required to not associate this service flow with a resequencing DSID."},
+ {0, NULL},
+};
+
+static const value_string dipl_up_upper_band_edge_conf_vals[] = {
+ {0, "Upstream Frequency Range up to 42 MHz"},
+ {1, "Upstream Frequency Range up to 65 MHz"},
+ {2, "Upstream Frequency Range up to 85 MHz"},
+ {3, "Upstream Frequency Range up to 117 MHz"},
+ {4, "Upstream Frequency Range up to 204 MHz"},
+ {0, NULL},
+};
+
+static const value_string docsis_time_prot_mode_vals[] = {
+ {0, "DTP operation is not supported"},
+ {1, "DTP Slave capable only"},
+ {2, "DTP Master capable only"},
+ {3, "DTP Master or Slave capable"},
+ {0, NULL},
+};
+
+static const value_string docsis_time_prot_perf_sup_vals[] = {
+ {0, "DTP mode is not supported"},
+ {1, "DTP support for DTP Level 1"},
+ {2, "DTP support for DTP Level 2"},
+ {3, "DTP support for DTP Level 3"},
+ {4, "DTP support for DTP Level 4"},
+ {5, "DTP support for DTP Level 5"},
+ {6, "DTP supported but with no specified performance"},
+ {0, NULL},
+};
+
+static const value_string rba_type_vals[] = {
+ {0, "Use RBA-SW"},
+ {1, "Use RBA-HW"},
+ {0, NULL},
+};
+
+static const value_string fdx_reset_vals[] = {
+ {0, "Do not reset FDX state"},
+ {1, "Reset FDX state and restart FDX initialization"},
+ {0, NULL},
+};
+
+static const value_string docsis_mcap_ext_sf_cluster_assign_sup_vals[] = {
+ {0, "No support"},
+ {1, "Support available"},
+ {0, NULL},
+};
+
+static const value_string extended_power_options_vals[] = {
+ {0, "No battery backup"},
+ {1, "Battery backup"},
+ {2, "Modem capacitance"},
+ {0, NULL},
+};
+
+static const unit_name_string local_units_mhz = { " MHz", NULL };
+
+static void
+fourth_db(char *buf, guint32 value)
+{
+ snprintf(buf, ITEM_LABEL_LENGTH, "%.2f dB", value/4.0);
+}
+
+static void
+fourth_dbmv(char *buf, guint32 value)
+{
+ snprintf(buf, ITEM_LABEL_LENGTH, "%.2f dBmV", value/4.0);
+}
+
+static reassembly_table ucd_reassembly_table;
+
+static const fragment_items ucd_frag_items = {
+ &ett_docsis_ucd_fragment,
+ &ett_docsis_ucd_fragments,
+ &hf_docsis_ucd_fragments,
+ &hf_docsis_ucd_fragment,
+ &hf_docsis_ucd_fragment_overlap,
+ &hf_docsis_ucd_fragment_overlap_conflict,
+ &hf_docsis_ucd_fragment_multiple_tails,
+ &hf_docsis_ucd_fragment_too_long_fragment,
+ &hf_docsis_ucd_fragment_error,
+ &hf_docsis_ucd_fragment_count,
+ &hf_docsis_ucd_reassembled_in,
+ &hf_docsis_ucd_reassembled_length,
+ &hf_docsis_ucd_reassembled_data,
+ "UCD fragments"
+};
+
+
+/* Dissection */
+static void
+dissect_unknown_tlv(tvbuff_t * tvb, packet_info *pinfo, proto_tree * tree, int start, guint16 len) {
+ guint type, length;
+ proto_tree * unknown_tree;
+ proto_item * unknown_item;
+
+ unknown_item = proto_tree_add_item(tree, hf_docsis_tlv_unknown, tvb, start, len, ENC_NA);
+ unknown_tree = proto_item_add_subtree(unknown_item, ett_docsis_tlv_unknown);
+
+ if (len < 2)
+ {
+ expert_add_info_format(pinfo, unknown_item, &ei_docsis_tlv_tlvlen_bad, "Unknown TLV: total length < 2: %u", len);
+ return;
+ }
+
+ proto_tree_add_item_ret_uint (unknown_tree, hf_docsis_tlv_unknown_type, tvb, start, 1, ENC_BIG_ENDIAN, &type);
+ proto_tree_add_item_ret_uint (unknown_tree, hf_docsis_tlv_unknown_length, tvb, start + 1, 1, ENC_BIG_ENDIAN, &length);
+
+ proto_item_append_text(unknown_item," (Type: %d, Length: %d)", type, length);
+
+ if (length + 2 != len)
+ {
+ expert_add_info_format(pinfo, unknown_item, &ei_docsis_tlv_tlvlen_bad, "Unknown TLV: Wrong TLV length: %u", length);
+ return;
+ }
+
+ proto_tree_add_item (unknown_tree, hf_docsis_tlv_unknown_value, tvb, start + 2, len - 2, ENC_NA);
+}
+
+static void
+dissect_phs_err (tvbuff_t * tvb, packet_info *pinfo, proto_tree * tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *err_tree;
+ proto_item *err_item;
+ int pos = start;
+
+ err_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sflow_err, &err_item,
+ "5 Service Flow Error Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case PHS_ERR_PARAM:
+ if (length == 1)
+ {
+ proto_tree_add_item (err_tree, hf_docsis_tlv_phs_err_param, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_ERR_CODE:
+ if (length == 1)
+ {
+ proto_tree_add_item (err_tree, hf_docsis_tlv_phs_err_code, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_ERR_MSG:
+ proto_tree_add_item (err_tree, hf_docsis_tlv_phs_err_msg, tvb, pos,
+ length, ENC_ASCII);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, err_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_phs (tvbuff_t * tvb, packet_info *pinfo, proto_tree * tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *phs_tree;
+ proto_item *phs_item;
+ int pos = start;
+
+ phs_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_phs, &phs_item,
+ "26 PHS Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case PHS_CLSFR_REF:
+ if (length == 1)
+ {
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_class_ref, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_CLSFR_ID:
+ if (length == 2)
+ {
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_class_id, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_SFLOW_REF:
+ if (length == 2)
+ {
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_sflow_ref, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_SFLOW_ID:
+ if (length == 4)
+ {
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_sflow_id, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_DSC_ACTION:
+ if (length == 1)
+ {
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_dsc_action,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_ERRORS:
+ dissect_phs_err (tvb, pinfo, phs_tree, pos, length);
+ break;
+ case PHS_FIELD:
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phsf, tvb, pos,
+ length, ENC_NA);
+ break;
+ case PHS_INDEX:
+ if (length == 1)
+ {
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phsi, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_MASK:
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phsm, tvb, pos,
+ length, ENC_NA);
+ break;
+ case PHS_SUP_SIZE:
+ if (length == 1)
+ {
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phss, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_VERIFICATION:
+ if (length == 1)
+ {
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phsf, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_DBC_ACTION:
+ if (length == 1)
+ {
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_dbc_action, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case PHS_VENDOR_SPEC:
+ proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_vendorspec, tvb,
+ pos, length, ENC_NA);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, phs_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static const true_false_string tfs_must_not_must = { "MUST NOT", "MUST" };
+static const true_false_string tfs_must_must_not = { "MUST", "MUST NOT" };
+
+static void
+dissect_reqxmit_policy (tvbuff_t * tvb, proto_tree * tree, int start)
+{
+ static int * const requests[] = {
+ &hf_docsis_tlv_sflow_reqxmit_all_cm_broadcast,
+ &hf_docsis_tlv_sflow_reqxmit_priority_multicast,
+ &hf_docsis_tlv_sflow_reqxmit_req_data_requests,
+ &hf_docsis_tlv_sflow_reqxmit_req_data_data,
+ &hf_docsis_tlv_sflow_reqxmit_piggy_back,
+ &hf_docsis_tlv_sflow_reqxmit_concatenate_data,
+ &hf_docsis_tlv_sflow_reqxmit_fragment,
+ &hf_docsis_tlv_sflow_reqxmit_suppress_payload,
+ &hf_docsis_tlv_sflow_reqxmit_drop_packets,
+ NULL
+ };
+ proto_tree_add_bitmask(tree, tvb, start, hf_docsis_tlv_sflow_reqxmit_pol,
+ ett_docsis_tlv_reqxmitpol, requests, ENC_BIG_ENDIAN);
+}
+
+static void
+dissect_sflow_err (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
+ guint16 len)
+{
+ guint8 type, length;
+ proto_tree *err_tree;
+ proto_item *err_item;
+ int pos = start;
+
+ err_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sflow_err, &err_item,
+ "5 Service Flow Error Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SFW_ERR_PARAM:
+ if (length == 1)
+ {
+ proto_tree_add_item (err_tree, hf_docsis_tlv_sflow_err_param,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_ERR_CODE:
+ if (length == 1)
+ {
+ proto_tree_add_item (err_tree, hf_docsis_tlv_sflow_err_code,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_ERR_MSG:
+ proto_tree_add_item (err_tree, hf_docsis_tlv_sflow_err_msg, tvb,
+ pos, length, ENC_ASCII);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, err_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_downstream_sflow (tvbuff_t * tvb, packet_info* pinfo, proto_tree * sflow_tree,
+ proto_item* sflow_item, int start, guint16 len)
+{
+ guint8 type, length;
+ int pos = start;
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SFW_MAX_DOWN_LAT:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_max_down_latency, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_DOWN_RESEQ:
+ if (length == 1)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_down_reseq, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, sflow_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_upstream_sflow (tvbuff_t * tvb, packet_info* pinfo, proto_tree * sflow_tree,
+ proto_item* sflow_item, int start, guint16 len)
+{
+ guint8 type, length;
+ int pos = start;
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SFW_MAX_CONCAT_BURST:
+ if (length == 2)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_max_concat_burst, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_SCHEDULING_TYPE:
+ if (length == 1)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_sched_type,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_REQ_XMIT_POL:
+ dissect_reqxmit_policy (tvb, sflow_tree, pos);
+ break;
+ case SFW_NOM_POLL_INT:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_nominal_polling, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_POLL_JTTR_TOL:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_tolerated_jitter, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_UG_SIZE:
+ if (length == 2)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_ugs_size,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_NOM_GRNT_INTV:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_nom_grant_intvl, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_GRNT_JTTR_TOL:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_tol_grant_jitter, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_GRNTS_PER_INTV:
+ if (length == 1)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_grants_per_intvl, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_UG_TIME_REF:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_ugs_timeref, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_CONTENTION_REQ_BACKOFF_WINDOW_MULT:
+ if (length == 1)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_cont_req_backoff_window_mult, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_NUM_OF_BYTES_REQUESTED_MULT:
+ if (length == 1)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_num_of_bytes_requested_mult, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ guint8 multiplier_val = tvb_get_guint8 (tvb, pos);
+ if (multiplier_val != 1 && multiplier_val != 2 && multiplier_val != 4 &&
+ multiplier_val != 8 && multiplier_val != 16)
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvval_bad,
+ "Wrong TLV value: %u (should be equal to 1,2,4,8 or 16)", multiplier_val);
+ }
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, sflow_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_sflow (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len,
+ guint8 direction)
+{
+ guint8 type, length;
+ proto_tree *sflow_tree;
+ proto_item *sflow_item;
+ int pos = start;
+
+ if (direction == 24)
+ sflow_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr, &sflow_item,
+ "24 Upstream Service Flow (Length = %u)", len);
+ else if (direction == 25)
+ sflow_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr, &sflow_item,
+ "25 Downstream Service Flow (Length = %u)", len);
+ else
+ return;
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SFW_REF:
+ if (length == 2)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_ref, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_ID:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_id, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_SID:
+ if (length == 2)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_sid, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_SERVICE_CLASS_NAME:
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_classname, tvb,
+ pos, length, ENC_ASCII);
+ break;
+ case SFW_ERRORS:
+ dissect_sflow_err (tvb, pinfo, sflow_tree, pos, length);
+ break;
+ case SFW_QOS_SET_TYPE:
+ if (length == 1)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_qos_param,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_TRAF_PRI:
+ if (length == 1)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_traf_pri,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_MAX_SUSTAINED:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_max_sus,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_MAX_BURST:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_max_burst,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_MIN_RSVD_TRAF:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_min_traf,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_MIN_RSVD_PACKETSIZE:
+ if (length == 2)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_ass_min_pkt_size, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_ACTIVE_QOS_TIMEOUT:
+ if (length == 2)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_timeout_active, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_ADMITT_QOS_TIMEOUT:
+ if (length == 2)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_timeout_admitted, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_IP_TOS_OVERWRITE:
+ if (length == 2)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_ip_tos_overwrite, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_PEAK_TRAFFIC_RATE:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_peak_traffic_rate, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_REQUIRED_ATTRIBUTE_MASK:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_req_attr_mask, tvb,
+ pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+
+ }
+ break;
+ case SFW_FORBIDDEN_ATTRIBUTE_MASK:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_forb_attr_mask, tvb,
+ pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_ATTRIBUTE_AGGREGATION_RULE_MASK:
+ if (length == 4)
+ {
+ proto_tree_add_item (sflow_tree,
+ hf_docsis_tlv_sflow_attr_aggr_rule_mask, tvb,
+ pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SFW_VENDOR_SPEC:
+ proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_vendor_spec,
+ tvb, pos, length, ENC_NA);
+ break;
+ default:
+ if (direction == 24)
+ dissect_upstream_sflow (tvb, pinfo, sflow_tree, sflow_item, pos - 2, length);
+ else
+ dissect_downstream_sflow (tvb, pinfo, sflow_tree, sflow_item, pos - 2, length);
+ break;
+
+ } /* switch (type) */
+ pos = pos + length;
+ } /* while(pos < start + len) */
+
+}
+
+static void
+dissect_dot1q_clsfr (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
+ guint16 len)
+{
+ guint8 type, length;
+ proto_tree *dot1qclsfr_tree;
+ proto_item *dot1qclsfr_item;
+ int pos = start;
+
+ dot1qclsfr_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_cos, &dot1qclsfr_item,
+ "11 801.1P/Q Classifiers (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case CFR_D1Q_USER_PRI:
+ if (length == 2)
+ {
+ proto_tree_add_item (dot1qclsfr_tree,
+ hf_docsis_tlv_dot1qclsfr_user_pri, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dot1qclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_D1Q_VLAN_ID:
+ if (length == 2)
+ {
+ proto_tree_add_item (dot1qclsfr_tree,
+ hf_docsis_tlv_dot1qclsfr_vlanid, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dot1qclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_D1Q_VENDOR_SPEC:
+ proto_tree_add_item (dot1qclsfr_tree,
+ hf_docsis_tlv_dot1qclsfr_vendorspec, tvb, pos,
+ length, ENC_NA);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, dot1qclsfr_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_eth_clsfr (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
+ guint16 len)
+{
+ guint8 type, length;
+ proto_tree *ethclsfr_tree;
+ proto_item *ethclsfr_item;
+ int pos = start;
+
+ ethclsfr_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_eth, &ethclsfr_item,
+ ".10 Ethernet Classifiers (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case CFR_ETH_DST_MAC:
+ if (length == 6)
+ {
+ proto_tree_add_item (ethclsfr_tree, hf_docsis_tlv_ethclsfr_dmac,
+ tvb, pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ethclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_ETH_SRC_MAC:
+ if (length == 6)
+ {
+ proto_tree_add_item (ethclsfr_tree, hf_docsis_tlv_ethclsfr_smac,
+ tvb, pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ethclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_ETH_DSAP:
+ if (length == 3)
+ {
+ proto_tree_add_item (ethclsfr_tree,
+ hf_docsis_tlv_ethclsfr_ethertype, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ethclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, ethclsfr_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_clsfr_err (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
+ guint16 len)
+{
+ guint8 type, length;
+ proto_tree *err_tree;
+ proto_tree *err_item;
+ int pos = start;
+
+ err_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_err, &err_item,
+ "8 Classifier Error Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case CFR_ERR_PARAM:
+ if (length == 1)
+ proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_param, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ else if (length == 2)
+ {
+ proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_param,
+ tvb, pos, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_param,
+ tvb, pos + 1, 1, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_ERR_CODE:
+ if (length == 1)
+ {
+ proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_code,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_ERR_MSG:
+ proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_msg, tvb,
+ pos, length, ENC_ASCII);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, err_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_ip_classifier (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
+ guint16 len)
+{
+ guint8 type, length;
+ proto_tree *ipclsfr_tree;
+ proto_tree *ipclsfr_item;
+ int pos = start;
+
+ ipclsfr_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_ip, &ipclsfr_item,
+ ".9 IP Classifier (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case CFR_IP_TOS_RANGE_MASK:
+ if (length == 3)
+ {
+ proto_tree_add_item (ipclsfr_tree,
+ hf_docsis_tlv_ipclsfr_tosmask, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP_PROTO:
+ if (length == 2)
+ {
+ proto_tree_add_item (ipclsfr_tree,
+ hf_docsis_tlv_ipclsfr_ipproto, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP_SOURCE_ADDR:
+ if (length == 4)
+ {
+ proto_tree_add_item (ipclsfr_tree, hf_docsis_tlv_ipclsfr_src,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP_SOURCE_MASK:
+ if (length == 4)
+ {
+ proto_tree_add_item (ipclsfr_tree,
+ hf_docsis_tlv_ipclsfr_srcmask, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP_DEST_ADDR:
+ if (length == 4)
+ {
+ proto_tree_add_item (ipclsfr_tree, hf_docsis_tlv_ipclsfr_dst,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP_DEST_MASK:
+ if (length == 4)
+ {
+ proto_tree_add_item (ipclsfr_tree,
+ hf_docsis_tlv_ipclsfr_dstmask, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP_SRCPORT_START:
+ if (length == 2)
+ {
+ proto_tree_add_item (ipclsfr_tree,
+ hf_docsis_tlv_ipclsfr_sport_start, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP_SRCPORT_END:
+ if (length == 2)
+ {
+ proto_tree_add_item (ipclsfr_tree,
+ hf_docsis_tlv_ipclsfr_sport_end, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP_DSTPORT_START:
+ if (length == 2)
+ {
+ proto_tree_add_item (ipclsfr_tree,
+ hf_docsis_tlv_ipclsfr_dport_start, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP_DSTPORT_END:
+ if (length == 2)
+ {
+ proto_tree_add_item (ipclsfr_tree,
+ hf_docsis_tlv_ipclsfr_dport_end, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, ipclsfr_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_ip6_classifier_tc (tvbuff_t * tvb, proto_tree * tree, int start,
+ guint16 len)
+{
+ proto_tree *ip6clsfr_tc_tree;
+ proto_tree *ip6clsfr_tc_item;
+
+ ip6clsfr_tc_tree = proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_ip6_tc, &ip6clsfr_tc_item,
+ "..1 IPv6 Traffic Class Range and Mask");
+
+ proto_tree_add_item(ip6clsfr_tc_tree, hf_docsis_tlv_ip6clsfr_tc_low, tvb, start, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(ip6clsfr_tc_tree, hf_docsis_tlv_ip6clsfr_tc_high, tvb, start + 1, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(ip6clsfr_tc_tree, hf_docsis_tlv_ip6clsfr_tc_mask, tvb, start + 2, 1, ENC_BIG_ENDIAN);
+
+}
+
+static void
+dissect_ip6_classifier (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
+ guint16 len)
+{
+ guint8 type, length;
+ proto_tree *ip6clsfr_tree;
+ proto_tree *ip6clsfr_item;
+ int pos = start;
+
+
+ ip6clsfr_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_ip6, &ip6clsfr_item,
+ ".12 IPv6 Classifier (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case CFR_IP6_TRAFFIC_CLASS:
+ if (length == 3)
+ {
+ dissect_ip6_classifier_tc(tvb, ip6clsfr_tree, pos, length);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP6_FLOW_LABEL:
+ if (length == 4)
+ {
+ proto_tree_add_item (ip6clsfr_tree,
+ hf_docsis_tlv_ip6clsfr_flow_label, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP6_NEXT_HEADER:
+ if (length == 2)
+ {
+ proto_tree_add_item (ip6clsfr_tree,
+ hf_docsis_tlv_ip6clsfr_next_header, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP6_SOURCE_ADDR:
+ if (length == 16)
+ {
+ proto_tree_add_item (ip6clsfr_tree,
+ hf_docsis_tlv_ip6clsfr_src, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP6_SOURCE_PREFIX_LENGTH:
+ if (length == 1)
+ {
+ proto_tree_add_item (ip6clsfr_tree,
+ hf_docsis_tlv_ip6clsfr_src_prefix_length, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP6_DESTINATION_ADDR:
+ if (length == 16)
+ {
+ proto_tree_add_item (ip6clsfr_tree,
+ hf_docsis_tlv_ip6clsfr_dst, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_IP6_DESTINATION_PREFIX_LENGTH:
+ if (length == 1)
+ {
+ proto_tree_add_item (ip6clsfr_tree,
+ hf_docsis_tlv_ip6clsfr_dst_prefix_length, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, ip6clsfr_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_classifiers (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
+ guint16 len, guint8 direction)
+{
+ guint8 type, length;
+ proto_tree *clsfr_tree;
+ proto_item *clsfr_item;
+ int pos = start;
+
+ if (direction == 22)
+ clsfr_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr, &clsfr_item,
+ "22 Upstream Packet Classifier (Length = %u)",
+ len);
+ else if (direction == 23)
+ clsfr_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr, &clsfr_item,
+ "23 Downstream Packet Classifier (Length = %u)",
+ len);
+ else
+ return;
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case CFR_REF:
+ if (length == 1)
+ {
+ proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_ref, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_ID:
+ if (length == 2)
+ {
+ proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_id, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_SFLOW_REF:
+ if (length == 2)
+ {
+ proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_sflow_ref,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_SFLOW_ID:
+ if (length == 4)
+ {
+ proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_sflow_id,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_RULE_PRI:
+ if (length == 1)
+ {
+ proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_rule_pri,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_ACT_STATE:
+ if (length == 1)
+ {
+ proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_act_state,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_DSA_ACTION:
+ if (length == 1)
+ {
+ proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_dsc_act,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CFR_ERROR:
+ dissect_clsfr_err (tvb, pinfo, clsfr_tree, pos, length);
+ break;
+ case CFR_IP_CLASSIFIER:
+ dissect_ip_classifier (tvb, pinfo, clsfr_tree, pos, length);
+ break;
+ case CFR_IP6_CLASSIFIER:
+ dissect_ip6_classifier (tvb, pinfo, clsfr_tree, pos, length);
+ break;
+ case CFR_ETH_CLASSIFIER:
+ dissect_eth_clsfr (tvb, pinfo, clsfr_tree, pos, length);
+ break;
+ case CFR_8021Q_CLASSIFIER:
+ dissect_dot1q_clsfr (tvb, pinfo, clsfr_tree, pos, length);
+ break;
+ case CFR_VENDOR_SPEC:
+ proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_vendor_spc,
+ tvb, pos, length, ENC_NA);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, clsfr_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_doc10cos (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
+ guint16 len)
+{
+ guint8 type, length;
+ proto_tree *doc10cos_tree;
+ proto_tree *doc10cos_item;
+ int pos = start;
+
+ doc10cos_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_cos, &doc10cos_item,
+ "1 Docsis 1.0 Class of Service (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case 1:
+ if (length == 1)
+ {
+ proto_tree_add_item (doc10cos_tree, hf_docsis_tlv_cos_id, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, doc10cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case 2:
+ if (length == 2)
+ {
+ proto_tree_add_item (doc10cos_tree, hf_docsis_tlv_cos_sid, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, doc10cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, doc10cos_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+
+ } /* while */
+}
+
+static void
+dissect_modemcap (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
+ guint16 len)
+{
+ guint8 type, length;
+ guint32 tlv_value;
+ proto_tree *mcap_tree, *tlv_tree;
+ proto_tree *mcap_item, *tlv_item;
+ int pos = start;
+
+ mcap_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_mcap, &mcap_item,
+ "5 Modem Capabilities Type (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case CAP_CONCAT:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_concat, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DOCSIS_VER:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_docs_ver,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_FRAG:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_frag, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_PHS:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_phs, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_IGMP:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_igmp, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_PRIVACY:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_privacy, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DOWN_SAID:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_down_said,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_UP_SID:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_up_sid, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_OPT_FILT:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_8021P_filter,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_8021Q_filter,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_XMIT_EQPERSYM:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree,
+ hf_docsis_tlv_mcap_xmit_eq_taps_per_sym,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_NUM_XMIT_EQ_TAPS:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_xmit_eq_taps,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DCC:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dcc, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_IP_FILTERS:
+ if (length == 2)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ip_filters, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_LLC_FILTERS:
+ if (length == 2)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_llc_filters, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_EXP_UNICAST_SID:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_exp_unicast_sid, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_RNG_HOFF:
+ if (length == 4)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_rnghoff_cm, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_rnghoff_erouter, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_rnghoff_emta, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_rnghoff_estb, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_L2VPN:
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_l2vpn, tvb,
+ pos, length, ENC_NA);
+ break;
+ case CAP_L2VPN_ESAFE:
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_l2vpn_esafe, tvb,
+ pos, length, ENC_NA);
+ break;
+ case CAP_DUT_FILTERING:
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dut_filtering, tvb,
+ pos, length, ENC_NA);
+ break;
+ case CAP_US_FREQ_RNG:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_freq_range, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_US_SRATE:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_160, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_320, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_640, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_1280, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_2560, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_5120, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_SAC:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_sac, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_CODE_HOP_M2:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_code_hop_mode2, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_MTC:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_mtc, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_512_MSPS_UTC:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_512_msps_utc, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_256_MSPS_UTC:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_256_msps_utc, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_TOTAL_SID_CLUST:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_total_sid_cluster, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_SID_PER_SF:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_sid_per_sf, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_MRC:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_mrc, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_TOTAL_DSID:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_total_dsid, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_RESEQ_DSID:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_reseq_dsid, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_MC_DSID:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_mc_dsid, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_MC_DSID_FWD:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_mc_dsid_fwd, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_FCTYPE_FWD:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_fctype_fwd, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DPV:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dpv_path, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dpv_packet, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_UGS:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ugs, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_MAP_UCD:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_map_ucd, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_UDC:
+ if (length == 2)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_udc, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_IPV6:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ipv6, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_EXT_US_TRNS_PWR:
+ if (length == 1)
+ {
+ guint power_raw;
+ proto_item * power_cap_it = proto_tree_add_item_ret_uint (mcap_tree, hf_docsis_tlv_mcap_ext_us_trans_power,
+ tvb, pos, length, ENC_BIG_ENDIAN, &power_raw);
+ proto_item_append_text(power_cap_it, " (%.2f dB)", power_raw * 0.25);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_EM:
+ if (length == 4)
+ {
+ static int * const cap_em[] = {
+ &hf_docsis_tlv_mcap_em_1x1,
+ &hf_docsis_tlv_mcap_em_light_sleep,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_em, ett_docsis_tlv_mcap_em, cap_em, ENC_BIG_ENDIAN, BMT_NO_FLAGS);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_CM_STATUS_ACK:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_cm_status_ack, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_EM_PREF:
+ if (length == 4)
+ {
+ static int * const em_pref[] = {
+ &hf_docsis_tlv_mcap_em_pref_1x1,
+ &hf_docsis_tlv_mcap_em_pref_dls,
+ NULL
+ };
+
+ proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_em_pref,
+ ett_docsis_tlv_mcap_em_pref, em_pref, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_EXT_PKT_LEN_SUP_CAP:
+ if (length == 2)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ext_pkt_len_sup_cap, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_OFDM_MULT_RECV_CHAN_SUP:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ofdm_mult_recv_chan_sup, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_OFDMA_MULT_TRANS_CHAN_SUP:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ofdma_mult_trans_chan_sup, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DOWN_OFDM_PROF_SUP:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_down_ofdm_prof_sup, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DOWN_OFDM_CHAN_SUBC_QAM_MOD_SUP:
+ if (length == 2)
+ {
+ static int * const ofdm_qam_mod_sup[] = {
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_reserved,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_qpsk,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16qam,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_64qam,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_128qam,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_256qam,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_512qam,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_1024qam,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_2048qam,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_4096qam,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_8192qam,
+ &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16384qam,
+ NULL
+ };
+
+ proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup,
+ ett_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup, ofdm_qam_mod_sup, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_UP_OFDMA_CHAN_SUBC_QAM_MOD_SUP:
+ if (length == 2)
+ {
+ static int * const ofdma_qam_mod_sup[] = {
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_reserved,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_qpsk,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_32qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_64qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_128qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_256qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_512qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_1024qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_2048qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_4096qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8192qam,
+ &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16384qam,
+ NULL
+ };
+
+ proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup,
+ ett_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup, ofdma_qam_mod_sup, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DOWN_LOWER_BAND_EDGE_CONF:
+ if (length == 1)
+ {
+ static int * const down_lower_band_edge_conf[] = {
+ &hf_docsis_tlv_mcap_down_lower_band_edge_conf_108,
+ &hf_docsis_tlv_mcap_down_lower_band_edge_conf_258,
+ NULL
+ };
+
+ proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_down_lower_band_edge_conf,
+ ett_docsis_tlv_mcap_down_lower_band_edge_conf, down_lower_band_edge_conf, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DOWN_UPPER_BAND_EDGE_CONF:
+ if (length == 1)
+ {
+ static int * const down_upper_band_edge_conf[] = {
+ &hf_docsis_tlv_mcap_down_upper_band_edge_conf_1218,
+ &hf_docsis_tlv_mcap_down_upper_band_edge_conf_1794,
+ &hf_docsis_tlv_mcap_down_upper_band_edge_conf_1002,
+ NULL
+ };
+
+ proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_down_upper_band_edge_conf,
+ ett_docsis_tlv_mcap_down_upper_band_edge_conf, down_upper_band_edge_conf, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DIPL_UP_UPPER_BAND_EDGE_CONF:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dipl_up_upper_band_edge_conf, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DOCSIS_TIME_PROT_MODE:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_docsis_time_prot_mode, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DOCSIS_TIME_PROT_PERF_SUP:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_docsis_time_prot_perf_sup, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_PMAX:
+ if (length == 2)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_pmax, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DIPL_DOWN_LOWER_BAND_EDGE:
+ if (length == 1)
+ {
+ static int * const dipl_down_lower_band_edge[] = {
+ &hf_docsis_tlv_mcap_dipl_down_lower_band_edge_108,
+ &hf_docsis_tlv_mcap_dipl_down_lower_band_edge_258,
+ NULL
+ };
+
+ proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_dipl_down_lower_band_edge,
+ ett_docsis_tlv_mcap_dipl_down_lower_band_edge, dipl_down_lower_band_edge, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DIPL_DOWN_UPPER_BAND_EDGE:
+ if (length == 1)
+ {
+ static int * const dipl_down_upper_band_edge[] = {
+ &hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1218,
+ &hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1794,
+ &hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1002,
+ NULL
+ };
+
+ proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_dipl_down_upper_band_edge,
+ ett_docsis_tlv_mcap_dipl_down_upper_band_edge, dipl_down_upper_band_edge, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_DIPL_UP_UPPER_BAND_EDGE:
+ if (length == 1)
+ {
+ static int * const dipl_up_upper_band_edge[] = {
+ &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_42,
+ &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_65,
+ &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_85,
+ &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_117,
+ &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_204,
+ NULL
+ };
+
+ proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_dipl_up_upper_band_edge,
+ ett_docsis_tlv_mcap_dipl_up_upper_band_edge, dipl_up_upper_band_edge, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_ADVANCED_BAND_PLAN:
+ if (length == 1)
+ {
+ static int * const advanved_band_plan[] = {
+ &hf_docsis_tlv_mcap_advanced_band_plan_fdx_l,
+ &hf_docsis_tlv_mcap_advanced_band_plan_fdx,
+ &hf_docsis_tlv_mcap_advanced_band_plan_fdd,
+ &hf_docsis_tlv_mcap_advanced_band_plan_reserved,
+ NULL
+ };
+
+ proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_advanced_band_plan,
+ ett_docsis_tlv_mcap_advanced_band_plan, advanved_band_plan, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_EXTENDED_SF_SID_CLUSTER_ASSIGN:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ext_sf_cluster_assign_sup, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_LOW_LATENCY_SUP:
+ if (length == 1)
+ {
+ tlv_item = proto_tree_add_item_ret_uint (mcap_tree, hf_docsis_tlv_mcap_low_latency_sup, tvb,
+ pos, length, ENC_BIG_ENDIAN, &tlv_value);
+ if (tlv_value > 0)
+ {
+ proto_item_append_text(tlv_item, " %s", (tlv_value == 1) ? "ASF" : "ASFs" );
+ }
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_ADVANCED_DOWN_LOWER_BAND_EDGE_CONF:
+ if (length == 2)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_adv_down_lower_band_edge_conf, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_ADVANCED_DOWN_UPPER_BAND_EDGE_CONF:
+ if (length == 2)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_adv_down_upper_band_edge_conf, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_ADVANCED_UP_UPPER_BAND_EDGE_CONF:
+ if (length == 2)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_adv_up_upper_band_edge_conf, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_ADVANCED_DOWN_LOWER_BAND_EDGE_OPTIONS_LIST:
+ if (length > 0 && length % 2 == 0)
+ {
+ tlv_tree = proto_tree_add_subtree_format(mcap_tree, tvb, pos, length,
+ ett_docsis_tlv_mcap_dipl_down_lower_band_edge_options_list, &tlv_item,
+ ".82 Advanced Diplexer Downstream Lower Band Edge Options List");
+
+ for (guint8 i = 0; i < length; i = i + 2)
+ {
+ proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_tlv_mcap_adv_down_lower_band_edge_option,
+ tvb, pos + i, 2, ENC_BIG_ENDIAN, &tlv_value);
+ proto_item_append_text(tlv_item, "%s %d MHz", (i == 0) ? ":" : ",", tlv_value);
+ }
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_ADVANCED_DOWN_UPPER_BAND_EDGE_OPTIONS_LIST:
+ if (length > 0 && length % 2 == 0)
+ {
+ tlv_tree = proto_tree_add_subtree_format(mcap_tree, tvb, pos, length,
+ ett_docsis_tlv_mcap_dipl_down_upper_band_edge_options_list, &tlv_item,
+ ".83 Advanced Diplexer Downstream Upper Band Edge Options List");
+
+ for (guint8 i = 0; i < length; i = i + 2)
+ {
+ proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_tlv_mcap_adv_down_upper_band_edge_option,
+ tvb, pos + i, 2, ENC_BIG_ENDIAN, &tlv_value);
+ proto_item_append_text(tlv_item, "%s %d MHz", (i == 0) ? ":" : ",", tlv_value);
+ }
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_ADVANCED_UP_UPPER_BAND_EDGE_OPTIONS_LIST:
+ if (length > 0 && length % 2 == 0)
+ {
+ tlv_tree = proto_tree_add_subtree_format(mcap_tree, tvb, pos, length,
+ ett_docsis_tlv_mcap_dipl_up_upper_band_edge_options_list, &tlv_item,
+ ".84 Advanced Diplexer Upstream Upper Band Edge Options List");
+
+ for (guint8 i = 0; i < length; i = i + 2)
+ {
+ proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_tlv_mcap_adv_up_upper_band_edge_option,
+ tvb, pos + i, 2, ENC_BIG_ENDIAN, &tlv_value);
+ proto_item_append_text(tlv_item, "%s %d MHz", (i == 0) ? ":" : ",", tlv_value);
+ }
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CAP_EXTENDED_POWER_OPTIONS:
+ if (length == 1)
+ {
+ proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_extended_power_options, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, mcap_tree, pos - 2, length + 2);
+ break;
+ } /* switch (type) */
+ pos = pos + length;
+ } /* while (pos < pos+len) */
+}
+
+static void
+dissect_cos (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *cos_tree;
+ proto_tree *cos_item;
+ int pos = start;
+
+ cos_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_cos, &cos_item,
+ "4 Class of Service Type (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case COS_CLASSID:
+ if (length == 1)
+ {
+ proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_id, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case COS_MAX_DOWN:
+ if (length == 4)
+ {
+ proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_max_down, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case COS_MAX_UP:
+ if (length == 4)
+ {
+ proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_max_up, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case COS_UP_CH_PRIO:
+ if (length == 1)
+ {
+ proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_up_chnl_pri,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case COS_MIN_UP_RATE:
+ if (length == 4)
+ {
+ proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_min_grntd_up,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case COS_MAX_UP_BURST:
+ if (length == 2)
+ {
+ proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_max_up_burst,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case COS_BP_ENABLE:
+ if (length == 1)
+ {
+ proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_privacy_enable,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, cos_tree, pos - 2, length + 2);
+ break;
+ } /* switch (type) */
+ pos = pos + length;
+ } /* while (pos < pos+len) */
+}
+
+static void
+dissect_svc_unavail(tvbuff_t * tvb, proto_tree * tree, int pos, guint16 length) {
+
+ proto_item *svc_unavail_it;
+ proto_tree *svc_unavail_tree;
+ svc_unavail_it = proto_tree_add_item (tree,
+ hf_docsis_tlv_svc_unavail,
+ tvb, pos, length, ENC_NA);
+ svc_unavail_tree = proto_item_add_subtree(svc_unavail_it, ett_docsis_tlv_svc_unavail );
+ proto_tree_add_item (svc_unavail_tree,
+ hf_docsis_tlv_svc_unavail_classid, tvb,
+ pos, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item (svc_unavail_tree,
+ hf_docsis_tlv_svc_unavail_type, tvb,
+ pos+1, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item (svc_unavail_tree,
+ hf_docsis_tlv_svc_unavail_code, tvb,
+ pos+2, 1, ENC_BIG_ENDIAN);
+
+}
+
+static void
+dissect_snmpv3_kickstart(tvbuff_t * tvb, packet_info * pinfo, proto_tree *tree, int start, guint16 len) {
+ proto_item *snmpv3_it;
+ proto_tree *snmpv3_tree;
+ guint8 type, length;
+ int pos = start;
+
+ snmpv3_it = proto_tree_add_item (tree,
+ hf_docsis_tlv_snmpv3_kick,
+ tvb, start, len, ENC_NA);
+ snmpv3_tree = proto_item_add_subtree(snmpv3_it, ett_docsis_tlv_snmpv3_kick);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SNMPV3_SEC_NAME:
+ proto_tree_add_item (snmpv3_tree,
+ hf_docsis_tlv_snmpv3_kick_name, tvb,
+ pos, length, ENC_ASCII);
+ break;
+ case SNMPV3_MGR_PUB_NUM:
+ proto_tree_add_item (snmpv3_tree,
+ hf_docsis_tlv_snmpv3_kick_publicnum, tvb,
+ pos, length, ENC_NA);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, snmpv3_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos += length;
+ } /* while */
+}
+
+static void
+dissect_ds_ch_list_single (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree,
+ int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *single_tree;
+ proto_item *single_item;
+ int pos = start;
+
+ single_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ds_ch_list_single, &single_item,
+ "1 Single Downstream Channel (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SINGLE_CH_TIMEOUT:
+ if (length == 2)
+ {
+ proto_tree_add_item (single_tree, hf_docsis_tlv_single_ch_timeout, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, single_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SINGLE_CH_FREQ:
+ if (length == 4)
+ {
+ proto_tree_add_item (single_tree, hf_docsis_tlv_single_ch_freq, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, single_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, single_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_ds_ch_list_range (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree,
+ int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *range_tree;
+ proto_item *range_item;
+ int pos = start;
+
+ range_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ds_ch_list_range, &range_item,
+ "2 Downstream Frequency Range (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case FREQ_RNG_TIMEOUT:
+ if (length == 2)
+ {
+ proto_tree_add_item (range_tree, hf_docsis_tlv_freq_rng_timeout, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, range_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case FREQ_RNG_START:
+ if (length == 4)
+ {
+ proto_tree_add_item (range_tree, hf_docsis_tlv_freq_rng_start, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, range_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case FREQ_RNG_END:
+ if (length == 4)
+ {
+ proto_tree_add_item (range_tree, hf_docsis_tlv_freq_rng_end, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, range_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case FREQ_RNG_STEP:
+ if (length == 4)
+ {
+ proto_tree_add_item (range_tree, hf_docsis_tlv_freq_rng_step, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, range_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, range_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_dut_filter (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree,
+ int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *dut_tree;
+ proto_item *dut_item;
+ int pos = start;
+
+ dut_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dut_filter, &dut_item,
+ "45 Downstream Unencrypted Traffic (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case DUT_CONTROL:
+ if (length == 1)
+ {
+ proto_tree_add_item (dut_tree, hf_docsis_tlv_dut_filter_control, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dut_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case DUT_CMIM:
+ proto_tree_add_item (dut_tree, hf_docsis_tlv_dut_filter_cmim, tvb,
+ pos, length, ENC_NA);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, dut_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_ds_ch_list(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *dschlst_tree;
+ proto_item *dschlst_item;
+ int pos = start;
+
+ dschlst_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ds_ch_list, &dschlst_item,
+ "41 Downstream Channel List (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case DS_CH_LIST_SINGLE:
+ dissect_ds_ch_list_single(tvb, pinfo, dschlst_tree, pos, length);
+ break;
+ case DS_CH_LIST_RANGE:
+ dissect_ds_ch_list_range(tvb, pinfo, dschlst_tree, pos, length);
+ break;
+ case DS_CH_LIST_DEFAULT_TIMEOUT:
+ if (length == 2)
+ {
+ proto_tree_add_item (dschlst_tree,
+ hf_docsis_tlv_ds_ch_list_default_timeout, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dschlst_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, dschlst_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_docsis_extension_field(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ proto_tree *ext_field_tree;
+ proto_item *ext_field_item;
+ tvbuff_t *vsif_tvb;
+
+ ext_field_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ext_field, &ext_field_item,
+ "43 DOCSIS Extension Field (Length = %u)", len);
+
+ vsif_tvb = tvb_new_subset_length (tvb, start, len);
+ call_dissector (docsis_vsif_handle, vsif_tvb, pinfo, ext_field_tree);
+}
+
+static void
+dissect_vendor_specific_capabilities(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ proto_tree *vend_spec_cap_tree;
+ proto_item *vend_spec_cap_item;
+ tvbuff_t *vsif_tvb;
+
+ vend_spec_cap_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_vendor_specific_cap, &vend_spec_cap_item,
+ "44 Vendor Specific Capabilities (Length = %u)", len);
+
+ vsif_tvb = tvb_new_subset_length (tvb, start, len);
+ call_dissector (docsis_vsif_handle, vsif_tvb, pinfo, vend_spec_cap_tree);
+}
+
+static void
+dissect_tcc_err(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *tccerr_tree;
+ proto_tree *tccerr_item;
+ int pos = start;
+
+ tccerr_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tcc_err, &tccerr_item,
+ "TCC Error Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TCC_ERR_SUBTYPE:
+ proto_tree_add_item (tccerr_tree,
+ hf_docsis_tcc_err_subtype, tvb,
+ pos, length, ENC_NA);
+ break;
+ case TCC_ERR_CODE:
+ if (length == 1)
+ {
+ proto_tree_add_item (tccerr_tree,
+ hf_docsis_tcc_err_code, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tccerr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TCC_ERR_MSG:
+ proto_tree_add_item (tccerr_tree,
+ hf_docsis_tcc_err_msg, tvb,
+ pos, length, ENC_ASCII);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, tccerr_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_tcc_rng_parms(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *rngparm_tree;
+ proto_item *rngparm_item;
+ int pos = start;
+
+ rngparm_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tcc_rng_parms, &rngparm_item,
+ ".8 Ranging Parameters (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case RNG_PARMS_US_CH_ID:
+ if (length == 1)
+ {
+ proto_tree_add_item (rngparm_tree,
+ hf_docsis_rng_parms_us_ch_id, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RNG_PARMS_TIME_OFF_INT:
+ if (length == 4)
+ {
+ proto_tree_add_item (rngparm_tree,
+ hf_docsis_rng_parms_time_off_int, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RNG_PARMS_TIME_OFF_FRAC:
+ if (length == 1)
+ {
+ proto_tree_add_item (rngparm_tree,
+ hf_docsis_rng_parms_time_off_frac, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RNG_PARMS_POWER_OFF:
+ if (length == 1)
+ {
+ proto_tree_add_item (rngparm_tree,
+ hf_docsis_rng_parms_power_off, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RNG_PARMS_FREQ_OFF:
+ if (length == 1)
+ {
+ proto_tree_add_item (rngparm_tree,
+ hf_docsis_rng_parms_freq_off, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, rngparm_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_tcc_oudp(tvbuff_t * tvb, proto_tree *tree, int start, guint16 len)
+{
+ proto_tree *oudp_tree;
+ proto_item *oudp_item;
+ int pos = start;
+
+ oudp_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tcc_oudp, &oudp_item,
+ ".11 Assigned OFDMA Upstream Data Profile (OUDP) IUC (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ proto_tree_add_item (oudp_tree, hf_docsis_tlv_tcc_oudp_iuc, tvb, pos, 1, ENC_BIG_ENDIAN);
+ ++pos;
+ }
+}
+
+static void
+dissect_sid_cl_so_crit(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *crit_tree;
+ proto_item *crit_item;
+ int pos = start;
+
+ crit_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sid_cl_so, &crit_item,
+ ".3 SID Cluster Switchover Criteria (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SID_CL_SO_MAX_REQ:
+ if (length == 1)
+ {
+ proto_tree_add_item (crit_tree,
+ hf_docsis_sid_cl_so_max_req, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, crit_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SID_CL_SO_MAX_OUT_BYTES:
+ if (length == 4)
+ {
+ proto_tree_add_item (crit_tree,
+ hf_docsis_sid_cl_so_max_out_bytes, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, crit_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SID_CL_SO_MAX_REQ_BYTES:
+ if (length == 4)
+ {
+ proto_tree_add_item (crit_tree,
+ hf_docsis_sid_cl_so_max_req_bytes, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, crit_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SID_CL_SO_MAX_TIME:
+ if (length == 2)
+ {
+ proto_tree_add_item (crit_tree,
+ hf_docsis_sid_cl_so_max_time, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, crit_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, crit_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_sid_cl_enc_map(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *map_tree;
+ proto_item *map_item;
+ int pos = start;
+
+ map_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sid_cl_enc_map, &map_item,
+ "..2 SID-to-Channel Mapping (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SID_CL_MAP_US_CH_ID:
+ if (length == 1)
+ {
+ proto_tree_add_item (map_tree,
+ hf_docsis_sid_cl_map_us_ch_id, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, map_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SID_CL_MAP_SID:
+ if (length == 2)
+ {
+ proto_tree_add_item (map_tree,
+ hf_docsis_sid_cl_map_sid, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, map_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SID_CL_MAP_ACTION:
+ if (length == 1)
+ {
+ proto_tree_add_item (map_tree,
+ hf_docsis_sid_cl_map_action, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, map_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, map_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_sid_cl_enc(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *enc_tree;
+ proto_item *enc_item;
+ int pos = start;
+
+ enc_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sid_cl_enc, &enc_item,
+ ".2 SID Cluster Encoding (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SID_CL_ENC_ID:
+ if (length == 1)
+ {
+ proto_tree_add_item (enc_tree,
+ hf_docsis_sid_cl_enc_id, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, enc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SID_CL_ENC_MAP:
+ if (length == 10)
+ dissect_sid_cl_enc_map(tvb, pinfo, enc_tree, pos, length);
+ else
+ expert_add_info_format(pinfo, enc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, enc_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_sid_cl(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *sid_tree;
+ proto_item *sid_item;
+ int pos = start;
+
+ sid_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sid_cl, &sid_item,
+ "47 Service Flow SID Cluster Assignments (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case SID_CL_SF_ID:
+ if (length == 4)
+ {
+ proto_tree_add_item (sid_tree,
+ hf_docsis_sid_cl_sf_id, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case SID_CL_ENC:
+ dissect_sid_cl_enc(tvb, pinfo, sid_tree, pos, length);
+ break;
+ case SID_CL_SO_CRIT:
+ dissect_sid_cl_so_crit(tvb, pinfo, sid_tree, pos, length);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, sid_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_tcc(tvbuff_t * tvb, packet_info * pinfo,
+ proto_tree *tree, int start, guint16 len, gint* previous_channel_id)
+{
+ guint8 type, length;
+ proto_tree *tcc_tree, *reassembled_ucd_tree;
+ proto_item *tcc_item, *reassembled_ucd_item;
+ int pos = start;
+ gint channel_id = -1;
+
+ fragment_head* reassembled_ucd = NULL;
+
+ tcc_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tcc, &tcc_item,
+ "46 Transmit Channel Configuration (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TLV_TCC_REFID:
+ if (length == 1)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_refid, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_US_CH_ACTION:
+ if (length == 1)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_us_ch_action, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_US_CH_ID:
+ if (length == 1)
+ {
+ proto_tree_add_item_ret_uint (tcc_tree,
+ hf_docsis_tlv_tcc_us_ch_id, tvb, pos,
+ length, ENC_BIG_ENDIAN, &channel_id);
+ /* Only perform reassembly on UCD if TLV is reassembled. fragment_end_seq_next added for the rare cases where UCD end is 254 long. */
+ if(!pinfo->fragmented && *previous_channel_id != -1) {
+ fragment_end_seq_next(&ucd_reassembly_table, pinfo, *previous_channel_id, NULL);
+ }
+ *previous_channel_id = channel_id;
+
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_NEW_US_CH_ID:
+ if (length == 1)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_new_us_ch_id, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_UCD:
+ proto_tree_add_item (tcc_tree, hf_docsis_tlv_tcc_ucd, tvb, pos, length, ENC_NA);
+ if (channel_id == -1) {
+ channel_id = *previous_channel_id;
+ }
+
+ /* Only perform reassembly on UCD if TLV is reassembled */
+ if(!pinfo->fragmented) {
+ reassembled_ucd_item = proto_tree_add_item(tcc_tree, hf_docsis_ucd_reassembled, tvb, 0, -1, ENC_NA);
+ reassembled_ucd_tree = proto_item_add_subtree (reassembled_ucd_item, ett_docsis_ucd_reassembled );
+
+ reassembled_ucd = fragment_add_seq_next(&ucd_reassembly_table,
+ tvb, pos, pinfo,
+ channel_id, NULL, /* ID for fragments belonging together */
+ length, /* fragment length - to the end */
+ (len == 254)); /* More fragments? */
+
+ if (reassembled_ucd) {
+ tvbuff_t *ucd_tvb = NULL;
+ ucd_tvb = process_reassembled_data(tvb, pos , pinfo, ".5 Reassembled UCD", reassembled_ucd, &ucd_frag_items,
+ NULL, reassembled_ucd_tree);
+
+ if (ucd_tvb && tvb_reported_length(ucd_tvb) > 0) {
+ call_dissector (docsis_ucd_handle, ucd_tvb, pinfo, reassembled_ucd_tree);
+ }
+ }
+ }
+
+ break;
+ case TLV_TCC_RNG_SID:
+ if (length == 2)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_rng_sid, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_INIT_TECH:
+ if (length == 1)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_init_tech, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_RNG_PARMS:
+ dissect_tcc_rng_parms(tvb, pinfo, tcc_tree, pos, length);
+ break;
+ case TLV_TCC_DYN_RNG_WIN:
+ if (length == 1)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_dyn_rng_win, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_P1_6HI:
+ if (length == 1)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_p_16hi, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_ASSIGN_OFDMA_UP_DATA_PROF:
+ dissect_tcc_oudp(tvb, tcc_tree, pos, length);
+ break;
+ case TLV_TCC_EXTENDED_DRW:
+ if (length == 1)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_extended_drw, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_EXTENDED_US_RNG_PWR:
+ if (length == 2)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_extended_us_rng_pwr, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_OUDP_SOUNDING_SID:
+ if (length == 2)
+ {
+ proto_tree_add_item (tcc_tree,
+ hf_docsis_tlv_tcc_oudp_sounding_sid, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TCC_ERR:
+ dissect_tcc_err(tvb, pinfo, tcc_tree, pos, length);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, tcc_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_ch_bl_rng(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *chblrng_tree;
+ proto_item *chblrng_item;
+ int pos = start;
+
+ chblrng_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcp_ch_bl_rng, &chblrng_item,
+ "..3 Receive Module Channel Block Range (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case CH_BL_RNG_MIN_CTR_FREQ:
+ if (length == 4)
+ {
+ proto_tree_add_item (chblrng_tree,
+ hf_docsis_ch_bl_rng_min_ctr_freq, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, chblrng_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CH_BL_RNG_MAX_CTR_FREQ:
+ if (length == 4)
+ {
+ proto_tree_add_item (chblrng_tree,
+ hf_docsis_ch_bl_rng_max_ctr_freq, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, chblrng_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, chblrng_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_rcp_rcv_mod(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *rcvmod_tree;
+ proto_item *rcvmod_item;
+ int pos = start;
+
+ rcvmod_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcp_rcv_mod_enc, &rcvmod_item,
+ ".4 Receive Module Capability (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case RCV_MOD_ENC_IDX:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcvmod_tree,
+ hf_docsis_rcv_mod_enc_idx, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCV_MOD_ENC_ADJ_CH:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcvmod_tree,
+ hf_docsis_rcv_mod_enc_adj_ch, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCV_MOD_ENC_CH_BL_RNG:
+ dissect_ch_bl_rng(tvb, pinfo, rcvmod_tree, pos, length);
+ break;
+ case RCV_MOD_ENC_CTR_FREQ_ASGN:
+ if (length == 4)
+ {
+ proto_tree_add_item (rcvmod_tree,
+ hf_docsis_rcv_mod_enc_ctr_freq_asgn, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCV_MOD_ENC_RSQ_CH_SUBS_CAP:
+ proto_tree_add_item (rcvmod_tree,
+ hf_docsis_rcv_mod_enc_rsq_ch_subs_cap, tvb, pos,
+ length, ENC_NA);
+ break;
+ case RCV_MOD_ENC_CONN:
+ proto_tree_add_item (rcvmod_tree,
+ hf_docsis_rcv_mod_enc_conn, tvb, pos,
+ length, ENC_NA);
+ break;
+ case RCV_MOD_ENC_PHY_LAYR_PARMS:
+ proto_tree_add_item (rcvmod_tree,
+ hf_docsis_rcv_mod_enc_phy_layr_parms, tvb, pos,
+ length, ENC_NA);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, rcvmod_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_rcp_rcv_ch(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *rcvch_tree;
+ proto_item *rcvch_item;
+ int pos = start;
+
+ rcvch_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcp_rcv_ch, &rcvch_item,
+ ".5 Receive Channels (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case RCV_CH_IDX:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcvch_tree,
+ hf_docsis_rcv_ch_idx, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCV_CH_CONN:
+ proto_tree_add_item (rcvch_tree,
+ hf_docsis_rcv_ch_conn, tvb, pos,
+ length, ENC_NA);
+ break;
+ case RCV_CH_CONN_OFF:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcvch_tree,
+ hf_docsis_rcv_ch_conn_off, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCV_CH_PRIM_DS_CH_IND:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcvch_tree,
+ hf_docsis_rcv_ch_prim_ds_ch_ind, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, rcvch_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+
+static void
+dissect_rcp(tvbuff_t * tvb, packet_info * pinfo,
+ proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *rcp_tree;
+ proto_item *rcp_item;
+ int pos = start;
+ tvbuff_t *vsif_tvb;
+
+ rcp_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcp, &rcp_item,
+ "48 Receive Channel Profile (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TLV_RCP_ID:
+ if (length == 5)
+ {
+ proto_tree_add_item (rcp_tree,
+ hf_docsis_tlv_rcp_id, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcp_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_RCP_NAME:
+ if (length <= 15)
+ {
+ proto_tree_add_item (rcp_tree,
+ hf_docsis_tlv_rcp_name, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcp_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_RCP_FREQ_SPC:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcp_tree,
+ hf_docsis_tlv_rcp_freq_spc, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcp_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_RCP_RCV_MOD_ENC:
+ dissect_rcp_rcv_mod(tvb, pinfo, rcp_tree, pos, length);
+ break;
+ case TLV_RCP_RCV_CH:
+ dissect_rcp_rcv_ch(tvb, pinfo, rcp_tree, pos, length);
+ break;
+ case TLV_RCP_VEN_SPEC:
+ vsif_tvb = tvb_new_subset_length (tvb, pos, length);
+ call_dissector (docsis_vsif_handle, vsif_tvb, pinfo, rcp_tree);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, rcp_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_rcc_rcv_mod(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *rcvmod_tree;
+ proto_item *rcvmod_item;
+ int pos = start;
+
+ rcvmod_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_rcv_mod_enc, &rcvmod_item,
+ ".4 Receive Module Assignment (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case RCV_MOD_ENC_IDX:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcvmod_tree,
+ hf_docsis_rcc_rcv_mod_enc_idx, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCV_MOD_ENC_CTR_FREQ_ASGN:
+ if (length == 4)
+ {
+ proto_tree_add_item (rcvmod_tree,
+ hf_docsis_rcc_rcv_mod_enc_ctr_freq_asgn, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCV_MOD_ENC_CONN:
+ proto_tree_add_item (rcvmod_tree,
+ hf_docsis_rcc_rcv_mod_enc_conn, tvb, pos,
+ length, ENC_NA);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, rcvmod_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_rcc_rcv_ch(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *rcvch_tree;
+ proto_item *rcvch_item;
+ int pos = start;
+
+ rcvch_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_rcv_ch, &rcvch_item,
+ ".5 Receive Channels (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case RCV_CH_IDX:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcvch_tree,
+ hf_docsis_rcc_rcv_ch_idx, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCV_CH_CONN:
+ proto_tree_add_item (rcvch_tree,
+ hf_docsis_rcc_rcv_ch_conn, tvb, pos,
+ length, ENC_NA);
+ break;
+ case RCV_CH_CTR_FREQ_ASGN:
+ if (length == 4)
+ {
+ proto_tree_add_item (rcvch_tree,
+ hf_docsis_rcc_rcv_ch_ctr_freq_asgn, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCV_CH_PRIM_DS_CH_IND:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcvch_tree,
+ hf_docsis_rcc_rcv_ch_prim_ds_ch_ind, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, rcvch_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_rcc_partial_serv_down_chan(tvbuff_t * tvb, proto_tree *tree, int start, guint16 len)
+{
+ proto_tree *rcc_partial_serv_down_chan_tree;
+ proto_item *rcc_partial_serv_down_chan_item;
+ int pos = start;
+ int i = 0;
+
+ rcc_partial_serv_down_chan_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_partial_serv_down_chan, &rcc_partial_serv_down_chan_item,
+ ".6 Partial Service Downstream Channels (Length = %u)", len);
+ for (i=0; i< len; ++i)
+ {
+ proto_tree_add_item (rcc_partial_serv_down_chan_tree,
+ hf_docsis_tlv_rcc_partial_serv_down_chan_id, tvb, pos+i,
+ 1, ENC_BIG_ENDIAN);
+ }
+}
+
+static void
+dissect_rcc_srcc_prim_ds_ch_assign(tvbuff_t * tvb, proto_tree *tree, int start, guint16 len)
+{
+ proto_tree *rcc_srcc_prim_ds_assign_tree;
+ proto_item *rcc_srcc_prim_ds_assign_item;
+ int pos = start;
+ int i = 0;
+
+ rcc_srcc_prim_ds_assign_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_srcc_prim_ds_assign, &rcc_srcc_prim_ds_assign_item,
+ "..1 RCC SRCC Primary Downstream Channel Assignment (Length = %u)", len);
+ for (i=0; i< len; ++i)
+ {
+ proto_tree_add_item (rcc_srcc_prim_ds_assign_tree,
+ hf_docsis_tlv_rcc_srcc_prim_ds_chan_assign_ds_ch_id, tvb, pos+i,
+ 1, ENC_BIG_ENDIAN);
+ }
+}
+
+static void
+dissect_rcc_srcc_ds_ch_assign(tvbuff_t * tvb, proto_tree *tree, int start, guint16 len)
+{
+ proto_tree *rcc_srcc_ds_assign_tree;
+ proto_item *rcc_srcc_ds_assign_item;
+ int pos = start;
+ int i = 0;
+
+ rcc_srcc_ds_assign_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_srcc_ds_assign, &rcc_srcc_ds_assign_item,
+ "..2 RCC SRCC Downstream Channel Assignment (Length = %u)", len);
+ for (i=0; i< len; ++i)
+ {
+ proto_tree_add_item (rcc_srcc_ds_assign_tree,
+ hf_docsis_tlv_rcc_srcc_ds_chan_assign_ds_ch_id, tvb, pos+i,
+ 1, ENC_BIG_ENDIAN);
+ }
+}
+
+static void
+dissect_rcc_srcc_ds_prof_assign_prof_list(tvbuff_t * tvb, proto_tree *tree, int start, guint16 len)
+{
+ proto_tree *rcc_srcc_ds_prof_assign_prof_list_tree;
+ proto_item *rcc_srcc_ds_prof_assign_prof_list_item;
+ int pos = start;
+ int i = 0;
+
+ rcc_srcc_ds_prof_assign_prof_list_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_srcc_ds_prof_assign_prof_list, &rcc_srcc_ds_prof_assign_prof_list_item,
+ "....2 RCC SRCC Downstream Profile Assignment - Profile List (Length = %u)", len);
+ for (i=0; i< len; ++i)
+ {
+ proto_tree_add_item (rcc_srcc_ds_prof_assign_prof_list_tree,
+ hf_docsis_tlv_rcc_srcc_ds_prof_asssign_prof_list_prof_id, tvb, pos+i,
+ 1, ENC_BIG_ENDIAN);
+ }
+}
+
+static void
+dissect_rcc_srcc_ds_prof_assign(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *rcc_srcc_ds_prof_assign_tree;
+ proto_item *rcc_srcc_ds_prof_assign_item;
+ int pos = start;
+
+ rcc_srcc_ds_prof_assign_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_srcc_ds_prof_assign, &rcc_srcc_ds_prof_assign_item,
+ "..3 RCC SRCC Downstream Profile Assignment(Length = %u)", len);
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case RCC_SRCC_DS_PROF_ASSIGN_DCID:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcc_srcc_ds_prof_assign_tree,
+ hf_docsis_tlv_rcc_srcc_ds_prof_assign_dcid, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcc_srcc_ds_prof_assign_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCC_SRCC_DS_PROF_ASSIGN_PROF_LIST:
+ dissect_rcc_srcc_ds_prof_assign_prof_list(tvb, rcc_srcc_ds_prof_assign_tree, pos, length);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, rcc_srcc_ds_prof_assign_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_rcc_srcc(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *rcc_srcc_tree;
+ proto_item *rcc_srcc_item;
+ int pos = start;
+
+ rcc_srcc_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_srcc, &rcc_srcc_item,
+ ".7 RCC Simplified Receive Channel Configuration (Length = %u)", len);
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case RCC_SRCC_PRIM_DS_CHAN_ASSIGN:
+ dissect_rcc_srcc_prim_ds_ch_assign(tvb, rcc_srcc_tree, pos, length);
+ break;
+ case RCC_SRCC_DS_CHAN_ASSIGN:
+ dissect_rcc_srcc_ds_ch_assign(tvb, rcc_srcc_tree, pos, length);
+ break;
+ case RCC_SRCC_DS_PROF_ASSIGN:
+ dissect_rcc_srcc_ds_prof_assign(tvb, pinfo, rcc_srcc_tree, pos, length);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, rcc_srcc_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_rcc_err(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *err_tree;
+ proto_item *err_item;
+ int pos = start;
+
+ err_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_rcv_ch, &err_item,
+ ".254 RCC Error Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case RCC_ERR_MOD_OR_CH:
+ if (length == 1)
+ {
+ proto_tree_add_item (err_tree,
+ hf_docsis_tlv_rcc_err_mod_or_ch, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCC_ERR_IDX:
+ if (length == 1)
+ {
+ proto_tree_add_item (err_tree,
+ hf_docsis_tlv_rcc_err_idx, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCC_ERR_PARAM:
+ if (length == 1)
+ {
+ proto_tree_add_item (err_tree,
+ hf_docsis_tlv_rcc_err_param, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCC_ERR_CODE:
+ if (length == 1)
+ {
+ proto_tree_add_item (err_tree,
+ hf_docsis_tlv_rcc_err_code, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case RCC_ERR_MSG:
+ proto_tree_add_item (err_tree,
+ hf_docsis_tlv_rcc_err_msg, tvb, pos,
+ length, ENC_NA);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, err_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_rcc(tvbuff_t * tvb, packet_info * pinfo,
+ proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *rcc_tree;
+ proto_item *rcc_item;
+ int pos = start;
+ tvbuff_t *vsif_tvb;
+
+ rcc_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc, &rcc_item,
+ "49 Receive Channel Configuration (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TLV_RCP_ID:
+ if (length == 5)
+ {
+ proto_tree_add_item (rcc_tree,
+ hf_docsis_tlv_rcc_id, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_RCP_RCV_MOD_ENC:
+ dissect_rcc_rcv_mod(tvb, pinfo, rcc_tree, pos, length);
+ break;
+ case TLV_RCP_RCV_CH:
+ dissect_rcc_rcv_ch(tvb, pinfo, rcc_tree, pos, length);
+ break;
+ case TLV_RCP_VEN_SPEC:
+ vsif_tvb = tvb_new_subset_length (tvb, pos, length);
+ call_dissector (docsis_vsif_handle, vsif_tvb, pinfo, rcc_tree);
+ break;
+ case TLV_RCC_PARTIAL_SERV_DOWN_CHAN:
+ dissect_rcc_partial_serv_down_chan(tvb, rcc_tree, pos, length);
+ break;
+ case TLV_RCC_SRCC:
+ dissect_rcc_srcc(tvb, pinfo, rcc_tree, pos, length);
+ break;
+ case TLV_RCC_PRIM_DOWN_CHAN:
+ if (length == 1)
+ {
+ proto_tree_add_item (rcc_tree,
+ hf_docsis_tlv_rcc_prim_down_chan, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, rcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_RCC_ERR:
+ dissect_rcc_err(tvb, pinfo, rcc_tree, pos, length);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, rcc_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_dsid_ds_reseq(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *dsid_tree;
+ proto_item *dsid_item;
+ int pos = start;
+
+ dsid_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid_ds_reseq, &dsid_item,
+ ".3 Resequencing DSID (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case DS_RESEQ_DSID:
+ if (length == 1)
+ {
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_ds_reseq_dsid, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case DS_RESEQ_CH_LST:
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_ds_reseq_ch_lst, tvb, pos,
+ length, ENC_NA);
+ break;
+ case DS_RESEQ_WAIT_TIME:
+ if (length == 1)
+ {
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_ds_reseq_wait_time, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case DS_RESEQ_WARN_THRESH:
+ if (length == 1)
+ {
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_ds_reseq_warn_thresh, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case DS_RESEQ_HO_TIMER:
+ if (length == 2)
+ {
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_ds_reseq_ho_timer, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, dsid_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_dsid_mc_addr(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *dsid_tree;
+ proto_item *dsid_item;
+ int pos = start;
+
+ dsid_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid_mc_addr, &dsid_item,
+ "..1 Client MAC Address Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case MC_ADDR_ACTION:
+ if (length == 1)
+ {
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_mc_addr_action, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case MC_ADDR_ADDR:
+ if (length == 6)
+ {
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_mc_addr_addr, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, dsid_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_dsid_mc(tvbuff_t * tvb, packet_info *pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *dsid_tree;
+ int pos = start;
+
+ dsid_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid_mc, NULL,
+ ".4 Multicast Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TLV_DSID_MC_ADDR:
+ dissect_dsid_mc_addr(tvb, pinfo, dsid_tree, pos, length);
+ break;
+ case TLV_DSID_MC_CMIM:
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_tlv_dsid_mc_cmim, tvb, pos,
+ length, ENC_NA);
+ break;
+ case TLV_DSID_MC_GROUP:
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_tlv_dsid_mc_group, tvb, pos,
+ length, ENC_NA);
+ break;
+ case TLV_DSID_MC_PHS:
+ dissect_phs(tvb, pinfo, dsid_tree, pos, length);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, dsid_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_dsid(tvbuff_t * tvb, packet_info *pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *dsid_tree;
+ proto_item *dsid_item;
+ int pos = start;
+
+ dsid_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid, &dsid_item,
+ "50 DSID Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TLV_DSID_ID:
+ if (length == 3)
+ {
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_tlv_dsid_id, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_DSID_ACTION:
+ if (length == 1)
+ {
+ proto_tree_add_item (dsid_tree,
+ hf_docsis_tlv_dsid_action, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_DSID_DS_RESEQ:
+ dissect_dsid_ds_reseq(tvb, pinfo, dsid_tree, pos, length);
+ break;
+ case TLV_DSID_MC:
+ dissect_dsid_mc(tvb, pinfo, dsid_tree, pos, length);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, dsid_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_sec_assoc(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *sec_tree;
+ proto_item *sec_item;
+ int pos = start;
+
+ sec_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid, &sec_item,
+ "51 Security Association Encodings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TLV_SEC_ASSOC_ACTION:
+ if (length == 1)
+ {
+ proto_tree_add_item (sec_tree,
+ hf_docsis_tlv_sec_assoc_action, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sec_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_SEC_ASSOC_DESC:
+ if (length == 14)
+ {
+ proto_tree_add_item (sec_tree,
+ hf_docsis_tlv_sec_assoc_desc, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, sec_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, sec_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_ch_asgn(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *asgn_tree;
+ proto_item *asgn_item;
+ int pos = start;
+
+ asgn_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ch_asgn, &asgn_item,
+ "56 Channel Assignment Configuration Settings (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TLV_CH_ASGN_US_CH_ID:
+ if (length == 1)
+ {
+ proto_tree_add_item (asgn_tree,
+ hf_docsis_ch_asgn_us_ch_id, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, asgn_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_CH_ASGN_RX_FREQ:
+ if (length == 4)
+ {
+ proto_tree_add_item (asgn_tree,
+ hf_docsis_ch_asgn_rx_freq, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, asgn_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, asgn_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_cmts_mc_sess_enc(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *mc_tree;
+ proto_item *mc_item;
+ int pos = start;
+
+ mc_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_cmts_mc_sess_enc, &mc_item,
+ "64 CMTS Static Multicast Session Encoding (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case CMTS_MC_SESS_ENC_GRP:
+ if (length == 4 || length == 16)
+ {
+ proto_tree_add_item (mc_tree,
+ hf_docsis_cmts_mc_sess_enc_grp, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CMTS_MC_SESS_ENC_SRC:
+ if (length == 4 || length == 16)
+ {
+ proto_tree_add_item (mc_tree,
+ hf_docsis_cmts_mc_sess_enc_src, tvb, pos,
+ length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, mc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case CMTS_MC_SESS_ENC_CMIM:
+ proto_tree_add_item (mc_tree,
+ hf_docsis_cmts_mc_sess_enc_cmim, tvb, pos,
+ length, ENC_NA);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, mc_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static void
+dissect_em_id_list_for_cm(tvbuff_t * tvb, proto_tree *tree, int start, guint16 len)
+{
+ proto_tree *em_id_list_tree;
+ proto_item *em_id_list_item;
+ int pos = start;
+
+ em_id_list_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_em_id_list_for_cm, &em_id_list_item,
+ "78 Energy Management Identifier List for CM (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ proto_tree_add_item (em_id_list_tree, hf_docsis_tlv_em_id_list_for_cm_em_id, tvb, pos, 2, ENC_NA);
+ pos+=2;
+ }
+}
+
+static void
+dissect_fdx_tg_assignment(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
+{
+ guint8 type, length;
+ proto_tree *tg_assignment_tree;
+ proto_item *tg_assignment_item;
+ int pos = start;
+ tvbuff_t *rba_tvb;
+
+ tg_assignment_tree =
+ proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tg_assignment, &tg_assignment_item,
+ "85 FDX Transmission Group Assignment (Length = %u)", len);
+
+ while (pos < (start + len))
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TLV_FDX_TG_ASSIGNMENT_TG_ID:
+ if (length == 1)
+ {
+ proto_tree_add_item (tg_assignment_tree,
+ hf_docsis_tlv_fdx_tg_assignment_tg_id, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tg_assignment_item, &ei_docsis_tlv_tlvlen_bad,
+ "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_FDX_TG_ASSIGNMENT_RBA_TYPE:
+ if (length == 1)
+ {
+ proto_tree_add_item (tg_assignment_tree,
+ hf_docsis_tlv_fdx_tg_assignment_rba_type, tvb, pos,
+ length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, tg_assignment_item, &ei_docsis_tlv_tlvlen_bad,
+ "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_FDX_TG_ASSIGNMENT_RBA_MESSAGE:
+ rba_tvb = tvb_new_subset_length (tvb, pos, length);
+ call_dissector (docsis_rba_handle, rba_tvb, pinfo, tg_assignment_tree);
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, tg_assignment_tree, pos - 2, length + 2);
+ break;
+ } /* switch */
+ pos = pos + length;
+ } /* while */
+}
+
+static int
+dissect_docsis_tlv (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
+{
+ proto_item *it;
+ proto_tree *tlv_tree;
+ int pos = 0;
+ gint total_len;
+ guint8 type, length;
+ guint16 x;
+ gint previous_channel_id = -1;
+
+ total_len = tvb_reported_length_remaining (tvb, 0);
+
+ {
+ it =
+ proto_tree_add_protocol_format (tree, proto_docsis_tlv, tvb, 0,
+ total_len, "TLV Data");
+ tlv_tree = proto_item_add_subtree (it, ett_docsis_tlv);
+ while (pos < total_len)
+ {
+ type = tvb_get_guint8 (tvb, pos++);
+ length = tvb_get_guint8 (tvb, pos++);
+ switch (type)
+ {
+ case TLV_DOWN_FREQ:
+ /* This is ugly. There are multiple type 1 TLVs that may appear
+ * in the TLV data, the problem is that they are dependent on
+ * message type. */
+ if (length == 4)
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_down_freq, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ else if (length == 1)
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_rng_tech, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ else
+ dissect_doc10cos (tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_CHNL_ID:
+ if (length == 1)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_upstream_chid,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_NET_ACCESS:
+ if (length == 1)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_net_access,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_COS:
+ dissect_cos (tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_MODEM_CAP:
+ dissect_modemcap (tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_CM_MIC:
+ if (length == 16)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_cm_mic, tvb,
+ pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_CMTS_MIC:
+ if (length == 16)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_cmts_mic, tvb,
+ pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_VENDOR_ID:
+ if (length == 3)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_vendor_id, tvb,
+ pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_SW_UPG_FILE:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_sw_file, tvb, pos,
+ length, ENC_ASCII);
+ break;
+ case TLV_SNMP_WRITE_CTRL:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_snmp_access, tvb,
+ pos, length, ENC_NA);
+ break;
+ case TLV_SNMP_OBJECT:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_snmp_obj, tvb,
+ pos, length, ENC_NA);
+ break;
+ case TLV_MODEM_IP:
+ if (length == 4)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_modem_addr,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_SVC_UNAVAIL:
+ if (length == 3)
+ {
+ dissect_svc_unavail(tvb, tlv_tree, pos, length);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_ETHERNET_MAC:
+ if (length == 6)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_cpe_ethernet,
+ tvb, pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TEL_SETTINGS:
+ break;
+ case TLV_BPI_CONFIG:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_bpi, tvb,
+ pos, length, ENC_NA);
+ break;
+ case TLV_MAX_CPES:
+ if (length == 1)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_max_cpe, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TFTP_TIME:
+ if (length == 4)
+ {
+ proto_tree_add_item (tlv_tree,
+ hf_docsis_tlv_tftp_server_timestamp,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TFTP_MODEM_ADDRESS:
+ if (length == 4)
+ {
+ proto_tree_add_item (tlv_tree,
+ hf_docsis_tlv_tftp_prov_modem_address,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_SW_UPG_SRVR:
+ if (length == 4)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_sw_upg_srvr,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_UPSTREAM_CLASSIFIER:
+ case TLV_DOWN_CLASSIFIER:
+ dissect_classifiers (tvb, pinfo, tlv_tree, pos, length, type);
+ break;
+ case TLV_UPSTREAM_SERVICE_FLOW:
+ case TLV_DOWN_SERVICE_FLOW:
+ dissect_sflow (tvb, pinfo, tlv_tree, pos, length, type);
+ break;
+ case TLV_PHS:
+ dissect_phs (tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_HMAC_DIGEST:
+ if (length == 20)
+ {
+ proto_tree_add_item (tlv_tree,
+ hf_docsis_tlv_hmac_digest, tvb,
+ pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_MAX_CLASSIFIERS:
+ if (length == 2)
+ {
+ proto_tree_add_item (tlv_tree,
+ hf_docsis_tlv_max_classifiers, tvb,
+ pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_PRIVACY_ENABLE:
+ if (length == 1)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_privacy_enable,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_AUTH_BLOCK:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_auth_block,
+ tvb, pos, length, ENC_NA);
+ break;
+ case TLV_KEY_SEQ_NUM:
+ if (length == 1)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_key_seq_num, tvb,
+ pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_MFGR_CVC:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_mfgr_cvc,
+ tvb, pos, length, ENC_NA);
+ break;
+ case TLV_COSIGN_CVC:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_cosign_cvc,
+ tvb, pos, length, ENC_NA);
+ break;
+ case TLV_SNMPV3_KICKSTART:
+ dissect_snmpv3_kickstart(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_SUBS_MGMT_CTRL:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_subs_mgmt_ctrl,
+ tvb, pos, length, ENC_NA);
+ break;
+ case TLV_SUBS_MGMT_CPE:
+ if ((length % 4) == 0)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_subs_mgmt_ip_table,
+ tvb, pos, length, ENC_NA);
+ for (x = 0; x < length; x+=4)
+ {
+ proto_tree_add_item (tlv_tree,
+ hf_docsis_tlv_subs_mgmt_ip_entry,
+ tvb, pos + x, 4, ENC_BIG_ENDIAN);
+ }
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_SUBS_MGMT_FLTR:
+ proto_tree_add_item (tlv_tree,
+ hf_docsis_tlv_subs_mgmt_filter_grps,
+ tvb, pos, length, ENC_NA);
+ break;
+ case TLV_SNMPV3_NTFY_RCVR:
+ proto_tree_add_item(tlv_tree,
+ hf_docsis_tlv_snmpv3_ntfy_rcvr,
+ tvb, pos, length, ENC_NA);
+ break;
+ case TLV_ENABLE_20_MODE:
+ if (length == 1)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_enable_20_mode,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_ENABLE_TEST_MODES:
+ if (length == 1)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_enable_test_modes,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_DS_CH_LIST:
+ dissect_ds_ch_list(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_MC_MAC_ADDRESS:
+ if (length == 6)
+ {
+ proto_tree_add_item(tlv_tree, hf_docsis_tlv_mc_mac_address,
+ tvb, pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_DOCSIS_EXTENSION_FIELD:
+ dissect_docsis_extension_field(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_VENDOR_SPEC:
+ dissect_vendor_specific_capabilities(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_DUT_FILTER:
+ dissect_dut_filter(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_TCC:
+ dissect_tcc(tvb, pinfo, tlv_tree, pos, length, &previous_channel_id);
+ break;
+ case TLV_SID_CL:
+ dissect_sid_cl(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_RCP:
+ dissect_rcp(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_RCC:
+ dissect_rcc(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_DSID:
+ dissect_dsid(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_SEC_ASSOC:
+ dissect_sec_assoc(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_INIT_CH_TIMEOUT:
+ if (length == 2)
+ {
+ proto_tree_add_item(tlv_tree, hf_docsis_tlv_init_ch_timeout,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_CH_ASGN:
+ dissect_ch_asgn(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_CM_INIT_REASON:
+ if (length == 1)
+ {
+ proto_tree_add_item(tlv_tree, hf_docsis_tlv_cm_init_reason,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_SW_UPG_SRVR_IPV6:
+ if (length == 16)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_sw_upg_srvr_ipv6,
+ tvb, pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_TFTP_PROV_CM_IPV6_ADDR:
+ if (length == 16)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_tftp_prov_cm_ipv6_addr,
+ tvb, pos, length, ENC_NA);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_US_DROP_CLFY:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_us_drop_clfy,
+ tvb, pos, length, ENC_NA);
+ break;
+ case TLV_SUBS_MGMT_IPV6_LST:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_subs_mgmt_ipv6_lst,
+ tvb, pos, length, ENC_NA);
+ break;
+ case TLV_US_DROP_CLFY_GROUP_ID:
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_us_drop_clfy_group_id,
+ tvb, pos, length, ENC_NA);
+ break;
+ case TLV_SUBS_MGMT_CTRL_MAX_CPE_IPV6:
+ if (length == 2)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_subs_mgmt_ctrl_max_cpe_ipv6,
+ tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_CMTS_MC_SESS_ENC:
+ dissect_cmts_mc_sess_enc(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_EM_MODE_INDICATOR:
+ if (length == 1)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_em_mode_ind, tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_EM_ID_LIST_FOR_CM:
+ dissect_em_id_list_for_cm(tvb, tlv_tree, pos, length);
+ break;
+ case TLV_FDX_TG_ASSIGNMENT:
+ dissect_fdx_tg_assignment(tvb, pinfo, tlv_tree, pos, length);
+ break;
+ case TLV_FDX_RESET:
+ if (length == 1)
+ {
+ proto_tree_add_item (tlv_tree, hf_docsis_tlv_fdx_reset, tvb, pos, length, ENC_BIG_ENDIAN);
+ }
+ else
+ {
+ expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
+ }
+ break;
+ case TLV_END:
+ break;
+ default:
+ dissect_unknown_tlv (tvb, pinfo, tlv_tree, pos - 2, length + 2);
+ break;
+ } /* switch(type) */
+
+ pos = pos + length;
+ } /* while (pos < total_len) */
+ } /* if (tree) */
+
+ return tvb_captured_length(tvb);
+}
+
+/* Register the protocol with Wireshark */
+void
+proto_register_docsis_tlv (void)
+{
+ static hf_register_info hf[] = {
+ {&hf_docsis_tlv_down_freq,
+ {"1 Downstream Frequency", "docsis_tlv.downfreq",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Downstream Frequency", HFILL}
+ },
+ {&hf_docsis_tlv_upstream_chid,
+ {"2 Upstream Channel ID", "docsis_tlv.upchid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Service Identifier", HFILL}
+ },
+ {&hf_docsis_tlv_net_access,
+ {"3 Network Access", "docsis_tlv.netaccess",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "Network Access TLV", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_cos,
+ {"4 COS Encodings", "docsis_tlv.cos",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_cos_id,
+ {".1 Class ID", "docsis_tlv.cos.id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Class ID", HFILL}
+ },
+ {&hf_docsis_tlv_cos_sid,
+ {".2 Service ID", "docsis_tlv.cos.sid",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Service ID", HFILL}
+ },
+ {&hf_docsis_tlv_cos_max_down,
+ {".2 Max Downstream Rate (bps)", "docsis_tlv.cos.maxdown",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Max Downstream Rate", HFILL}
+ },
+ {&hf_docsis_tlv_cos_max_up,
+ {".3 Max Upstream Rate (bps)", "docsis_tlv.cos.maxup",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Max Upstream Rate", HFILL}
+ },
+ {&hf_docsis_tlv_cos_up_chnl_pri,
+ {".4 Upstream Channel Priority", "docsis_tlv.cos.upchnlpri",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Upstream Channel Priority", HFILL}
+ },
+ {&hf_docsis_tlv_cos_min_grntd_up,
+ {".5 Guaranteed Upstream Rate", "docsis_tlv.cos.mingrntdup",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Guaranteed Minimum Upstream Data Rate", HFILL}
+ },
+ {&hf_docsis_tlv_cos_max_up_burst,
+ {".6 Maximum Upstream Burst", "docsis_tlv.cos.maxupburst",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Maximum Upstream Burst", HFILL}
+ },
+ {&hf_docsis_tlv_cos_privacy_enable,
+ {".7 COS Privacy Enable", "docsis_tlv.cos.privacy_enable",
+ FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
+ "Class of Service Privacy Enable", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_mcap,
+ {"5 Modem Capabilities", "docsis_tlv.mcap",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Modem Capabilities", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_mcap_concat,
+ {".1 Concatenation Support", "docsis_tlv.mcap.concat",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "Concatenation Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_docs_ver,
+ {".2 Docsis Version", "docsis_tlv.map.docsver",
+ FT_UINT8, BASE_DEC, VALS (docs_ver_vals), 0x0,
+ "DOCSIS Version", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_frag,
+ {".3 Fragmentation Support", "docsis_tlv.mcap.frag",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "Fragmentation Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_phs,
+ {".4 PHS Support", "docsis_tlv.mcap.phs",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "PHS Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_igmp,
+ {".5 IGMP Support", "docsis_tlv.mcap.igmp",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "IGMP Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_privacy,
+ {".6 Privacy Support", "docsis_tlv.mcap.privacy",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "Privacy Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_down_said,
+ {".7 # Downstream SAIDs Supported", "docsis_tlv.mcap.downsaid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Downstream Said Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_up_sid,
+ {".8 # Upstream Service Flows Supported", "docsis_tlv.mcap.upsid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Upstream Service Flows Supported", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_8021P_filter,
+ {".9 802.1P Filtering Support", "docsis_tlv.mcap.dot1pfiltering",
+ FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x80,
+ "802.1P Filtering Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_8021Q_filter,
+ {".9 802.1Q Filtering Support", "docsis_tlv.mcap.dot1qfilt",
+ FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x40,
+ "802.1Q Filtering Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_xmit_eq_taps_per_sym,
+ {".10 Xmit Equalizer Taps/Sym", "docsis_tlv.mcap.tapspersym",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Transmit Equalizer Taps per Symbol", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_xmit_eq_taps,
+ {".11 # Xmit Equalizer Taps", "docsis_tlv.mcap.numtaps",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Number of Transmit Equalizer Taps", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dcc,
+ {".12 DCC Support", "docsis_tlv.mcap.dcc",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "DCC Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ip_filters,
+ {".13 IP Filters Support","docsis_tlv.mcap.ipfilters",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "IP Filters Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_llc_filters,
+ {".14 LLC Filters Support","docsis_tlv.mcap.llcfilters",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "LLC Filters Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_exp_unicast_sid,
+ {".15 Expanded Unicast SID Space","docsis_tlv.mcap.exucsid",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "Expanded Unicast SID Space", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_rnghoff_cm,
+ {".16 Ranging Hold-Off (CM)","docsis_tlv.mcap.rnghoffcm",
+ FT_BOOLEAN, 32, TFS(&tfs_on_off), 0x00000001,
+ "Ranging Hold-Off (CM)", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_rnghoff_erouter,
+ {".16 Ranging Hold-Off (ePS or eRouter)",
+ "docsis_tlv.mcap.rnghofferouter",
+ FT_BOOLEAN, 32, TFS(&tfs_on_off), 0x00000002,
+ "Ranging Hold-Off (ePS or eRouter)", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_rnghoff_emta,
+ {".16 Ranging Hold-Off (eMTA or EDVA)",
+ "docsis_tlv.mcap.rnghoffemta",
+ FT_BOOLEAN, 32, TFS(&tfs_on_off), 0x00000004,
+ "Ranging Hold-Off (eMTA or EDVA)", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_rnghoff_estb,
+ {".16 Ranging Hold-Off (DSG/eSTB)",
+ "docsis_tlv.mcap.rnghoffestb",
+ FT_BOOLEAN, 32, TFS(&tfs_on_off), 0x00000008,
+ "Ranging Hold-Off (DSG/eSTB)", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_l2vpn,
+ {".17 L2VPN Capability","docsis_tlv.mcap.l2vpn",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "L2VPN Capability", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_l2vpn_esafe,
+ {".18 L2VPN eSAFE Host Capability","docsis_tlv.mcap.l2vpnesafe",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "L2VPN eSAFE Host Capability", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dut_filtering,
+ {".19 Downstream Unencrypted Traffic (DUT) Filtering",
+ "docsis_tlv.mcap.dut",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Downstream Unencrypted Traffic (DUT) Filtering", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_us_freq_range,
+ {".20 Upstream Frequency Range Support",
+ "docsis_tlv.mcap.usfreqrng",
+ FT_UINT8, BASE_DEC, VALS (docsis_freq_rng_vals), 0x0,
+ "Upstream Frequency Range Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_us_srate_160,
+ {".21 Upstream Symbol Rate 160ksps supported",
+ "docsis_tlv.mcap.srate160",
+ FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x01,
+ "Upstream Symbol Rate 160ksps supported", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_us_srate_320,
+ {".21 Upstream Symbol Rate 320ksps supported",
+ "docsis_tlv.mcap.srate320",
+ FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x02,
+ "Upstream Symbol Rate 320ksps supported", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_us_srate_640,
+ {".21 Upstream Symbol Rate 640ksps supported",
+ "docsis_tlv.mcap.srate640",
+ FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x04,
+ "Upstream Symbol Rate 640ksps supported", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_us_srate_1280,
+ {".21 Upstream Symbol Rate 1280ksps supported",
+ "docsis_tlv.mcap.srate1280",
+ FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x08,
+ "Upstream Symbol Rate 1280ksps supported", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_us_srate_2560,
+ {".21 Upstream Symbol Rate 2560ksps supported",
+ "docsis_tlv.mcap.srate2560",
+ FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x10,
+ "Upstream Symbol Rate 2560ksps supported", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_us_srate_5120,
+ {".21 Upstream Symbol Rate 5120ksps supported",
+ "docsis_tlv.mcap.srate5120",
+ FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x20,
+ "Upstream Symbol Rate 5120ksps supported", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_sac,
+ {".22 Selectable Active Code Mode 2 Support","docsis_tlv.mcap.sac",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "Selectable Active Code Mode 2 Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_code_hop_mode2,
+ {".23 Code Hopping Mode 2 Support","docsis_tlv.mcap.codehopm2",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "Code Hopping Mode 2 Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_mtc,
+ {".24 Multiple Transmit Channel Support","docsis_tlv.mcap.mtc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Multiple Transmit Channel Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_512_msps_utc,
+ {".25 5.12 Msps Upstream Transmit Channel Support",
+ "docsis_tlv.mcap.512mspsutc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "5.12 Msps Upstream Transmit Channel Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_256_msps_utc,
+ {".26 2.56 Msps Upstream Transmit Channel Support",
+ "docsis_tlv.mcap.256mspsutc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "2.56 Msps Upstream Transmit Channel Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_total_sid_cluster,
+ {".27 Total SID Cluster Support","docsis_tlv.mcap.totalsidcl",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Total SID Cluster Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_sid_per_sf,
+ {".28 SID Clusters per Service Flow Support",
+ "docsis_tlv.mcap.sidpersf",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "SID Clusters per Service Flow Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_mrc,
+ {".29 Multiple Receive Channel Support","docsis_tlv.mcap.mrc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Multiple Receive Channel Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_total_dsid,
+ {".30 Total Downstream Service ID (DSID) Support",
+ "docsis_tlv.mcap.totaldsid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Total Downstream Service ID (DSID) Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_reseq_dsid,
+ {".31 Resequencing Downstream Service ID (DSID) Support",
+ "docsis_tlv.mcap.reseqdsid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Resequencing Downstream Service ID (DSID) Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_mc_dsid,
+ {".32 Multicast Downstream Service ID (DSID) Support",
+ "docsis_tlv.mcap.mcdsid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Multicast Downstream Service ID (DSID) Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_mc_dsid_fwd,
+ {".33 Multicast DSID Forwarding","docsis_tlv.mcap.mcdsidfwd",
+ FT_UINT8, BASE_DEC, VALS (mc_dsid_fwd_vals), 0x0,
+ "Mulitcast DSID Forwarding", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_fctype_fwd,
+ {".34 Frame Control Type Forwarding Capability",
+ "docsis_tlv.mcap.fctypefwd",
+ FT_UINT8, BASE_DEC, VALS (fctype_fwd_vals), 0x0,
+ "Frame Control Type Forwarding Capability", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dpv_path,
+ {".35 DPV Capability (per Path)","docsis_tlv.mcap.dpvpath",
+ FT_UINT8, BASE_DEC, NULL, 0x1,
+ "DPV Capability (per Path)", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dpv_packet,
+ {".35 DPV Capability (per Packet)","docsis_tlv.mcap.dpvpacket",
+ FT_UINT8, BASE_DEC, NULL, 0x2,
+ "DPV Capability (per Packet)", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ugs,
+ {".36 Unsolicited Grant Service Support","docsis_tlv.mcap.ugs",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Unsolicited Grant Service Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_map_ucd,
+ {".37 MAP and UCD Receipt Support","docsis_tlv.mcap.mapucd",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "MAP and UCD Receipt Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_udc,
+ {".38 Upstream Drop Classifier Support","docsis_tlv.mcap.udc",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Upstream Drop Classifier Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ipv6,
+ {".39 IPv6 Support","docsis_tlv.mcap.ipv6",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
+ "IPv6 Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ext_us_trans_power,
+ {".40 Extended Upstream Transmit Power Capability",
+ "docsis_tlv.mcap.extustrpwr",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Extended Upstream Transmit Power Capability", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_em,
+ {".44 Energy Management Capabilities", "docsis_tlv.mcap.em",
+ FT_UINT32, BASE_HEX, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_em_1x1,
+ {"Energy Management 1x1 Feature",
+ "docsis_tlv.mcap.em.1x1",
+ FT_BOOLEAN, 32, TFS (&sup_unsup_tfs), 0x1,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_em_light_sleep,
+ {"DOCSIS Light Sleep Mode",
+ "docsis_tlv.mcap.em.light_sleep",
+ FT_BOOLEAN, 32, TFS (&sup_unsup_tfs), 0x2,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_cm_status_ack,
+ {".46 CM-STATUS_ACK",
+ "docsis_tlv.mcap.cm_status_ack",
+ FT_UINT8, BASE_DEC, VALS(sup_unsup_vals), 0x0,
+ "CM_STATUS_ACK", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_em_pref,
+ {".47 Energy Management Preference",
+ "docsis_tlv.mcap.em_pref",
+ FT_UINT32, BASE_HEX, NULL, 0x0,
+ "Energy Management Preference", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_em_pref_1x1,
+ {"Energy Management 1x1 Feature",
+ "docsis_tlv.mcap.em_pref.1x1",
+ FT_BOOLEAN, 32, NULL, 0x1,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_em_pref_dls,
+ {"DOCSIS Light Sleep Mode",
+ "docsis_tlv.mcap.em_pref.dls",
+ FT_BOOLEAN, 32, NULL, 0x2,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ext_pkt_len_sup_cap,
+ {".48 Extended Packet Length Support Capability",
+ "docsis_tlv.mcap.ext_pkt_len_sup_cap",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Extended Packet Length Support Capability", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_mult_recv_chan_sup,
+ {".49 OFDM Multiple Receive Channel Support",
+ "docsis_tlv.mcap.ofdm_mult_recv_chan_sup",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "OFDM Multiple Receive Channel Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_mult_trans_chan_sup,
+ {".50 OFDMA Multiple Transmit Channel Support",
+ "docsis_tlv.mcap.ofdma_mult_trans_chan_sup",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "OFDMA Multiple Transmit Channel Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_down_ofdm_prof_sup,
+ {".51 Downstream OFDM Profile Support",
+ "docsis_tlv.mcap.down_ofdm_prof_sup",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Downstream OFDM Profile Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup,
+ {".52 Downstream OFDM channel subcarrier QAM modulation support",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Downstream OFDM channel subcarrier QAM modulation support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_reserved,
+ {"Reserved",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.reserved",
+ FT_BOOLEAN, 16, NULL, 0x802B,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_qpsk,
+ {"QPSK",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.qpsk",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16qam,
+ {"16-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.16qam",
+ FT_BOOLEAN, 16, NULL, 0x0010,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_64qam,
+ {"64-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.64qam",
+ FT_BOOLEAN, 16, NULL, 0x0040,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_128qam,
+ {"128-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.128qam",
+ FT_BOOLEAN, 16, NULL, 0x0080,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_256qam,
+ {"256-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.256qam",
+ FT_BOOLEAN, 16, NULL, 0x0100,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_512qam,
+ {"512-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.512qam",
+ FT_BOOLEAN, 16, NULL, 0x0200,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_1024qam,
+ {"1024-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.1024qam",
+ FT_BOOLEAN, 16, NULL, 0x0400,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_2048qam,
+ {"2048-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.2048qam",
+ FT_BOOLEAN, 16, NULL, 0x0800,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_4096qam,
+ {"4096-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.4096qam",
+ FT_BOOLEAN, 16, NULL, 0x1000,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_8192qam,
+ {"8192-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.8192qam",
+ FT_BOOLEAN, 16, NULL, 0x2000,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16384qam,
+ {"16384-QAM",
+ "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.16384qam",
+ FT_BOOLEAN, 16, NULL, 0x4000,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup,
+ {".53 Upstream OFDMA channel subcarrier QAM modulation support",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Upstream OFDMA channel subcarrier QAM modulation support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_reserved,
+ {"Reserved",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.reserved",
+ FT_BOOLEAN, 16, NULL, 0x8003,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_qpsk,
+ {"QPSK",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.qpsk",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8qam,
+ {"8-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.8qam",
+ FT_BOOLEAN, 16, NULL, 0x0008,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16qam,
+ {"16-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.16qam",
+ FT_BOOLEAN, 16, NULL, 0x0010,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_32qam,
+ {"32-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.32qam",
+ FT_BOOLEAN, 16, NULL, 0x0020,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_64qam,
+ {"64-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.64qam",
+ FT_BOOLEAN, 16, NULL, 0x0040,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_128qam,
+ {"128-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.128qam",
+ FT_BOOLEAN, 16, NULL, 0x0080,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_256qam,
+ {"256-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.256qam",
+ FT_BOOLEAN, 16, NULL, 0x0100,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_512qam,
+ {"512-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.512qam",
+ FT_BOOLEAN, 16, NULL, 0x0200,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_1024qam,
+ {"1024-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.1024qam",
+ FT_BOOLEAN, 16, NULL, 0x0400,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_2048qam,
+ {"2048-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.2048qam",
+ FT_BOOLEAN, 16, NULL, 0x0800,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_4096qam,
+ {"4096-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.4096qam",
+ FT_BOOLEAN, 16, NULL, 0x1000,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8192qam,
+ {"8192-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.8192qam",
+ FT_BOOLEAN, 16, NULL, 0x2000,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16384qam,
+ {"16384-QAM",
+ "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.16384qam",
+ FT_BOOLEAN, 16, NULL, 0x4000,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_down_lower_band_edge_conf,
+ {".54 Downstream Lower Band Edge Configuration",
+ "docsis_tlv.mcap.down_lower_band_edge_conf",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Downstream Lower Band Edge Configuration", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_down_lower_band_edge_conf_108,
+ {"Downstream Frequency Range starting from 108 MHz",
+ "docsis_tlv.mcap.down_lower_band_edge_conf.108mhz",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_down_lower_band_edge_conf_258,
+ {"Downstream Frequency Range starting from 258 MHz",
+ "docsis_tlv.mcap.down_lower_band_edge_conf.258mhz",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_down_upper_band_edge_conf,
+ {".55 Downstream Upper Band Edge Configuration",
+ "docsis_tlv.mcap.down_upper_band_edge_conf",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Downstream Upper Band Edge Configuration", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_down_upper_band_edge_conf_1218,
+ {"Downstream Frequency Range up to 1218 MHz",
+ "docsis_tlv.mcap.down_upper_band_edge_conf.1218mhz",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_down_upper_band_edge_conf_1794,
+ {"Downstream Frequency Range up to 1794 MHz",
+ "docsis_tlv.mcap.down_upper_band_edge_conf.1794mhz",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_down_upper_band_edge_conf_1002,
+ {"Downstream Frequency Range up to 1002 MHz",
+ "docsis_tlv.mcap.down_upper_band_edge_conf.1002mhz",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_conf,
+ {".56 Diplexer Upstream Upper Band Edge Configuration",
+ "docsis_tlv.mcap.dipl_up_upper_band_edge_conf",
+ FT_UINT8, BASE_DEC, VALS(dipl_up_upper_band_edge_conf_vals), 0x0,
+ "Diplexer Upstream Upper Band Edge Configuration", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_docsis_time_prot_mode,
+ {".57 DOCSIS Time Protocol Mode",
+ "docsis_tlv.mcap.docsis_time_prot_mode",
+ FT_UINT8, BASE_DEC, VALS(docsis_time_prot_mode_vals), 0x0,
+ "DOCSIS Time Protocol Mode", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_docsis_time_prot_perf_sup,
+ {".58 DOCSIS Time Protocol Performance Support",
+ "docsis_tlv.mcap.docsis_time_prot_perf_sup",
+ FT_UINT8, BASE_DEC, VALS(docsis_time_prot_perf_sup_vals), 0x0,
+ "DOCSIS Time Protocol Performance Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_pmax,
+ {".59 Pmax",
+ "docsis_tlv.mcap.pmax",
+ FT_UINT16, BASE_CUSTOM, CF_FUNC(fourth_dbmv), 0x0,
+ "Pmax", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_down_lower_band_edge,
+ {".60 Diplexer Downstream Lower Band Edge",
+ "docsis_tlv.mcap.dipl_down_lower_band_edge",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Diplexer Downstream Lower Band Edge", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_down_lower_band_edge_108,
+ {"Downstream Frequency Range starting from 108 MHz",
+ "docsis_tlv.mcap.dipl_down_lower_band_edge.108mhz",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_down_lower_band_edge_258,
+ {"Downstream Frequency Range starting from 258 MHz",
+ "docsis_tlv.mcap.dipl_down_lower_band_edge.258mhz",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_down_upper_band_edge,
+ {".61 Diplexer Downstream Upper Band Edge",
+ "docsis_tlv.mcap.dipl_down_upper_band_edge",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Diplexer Downstream Upper Band Edge", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1218,
+ {"Downstream Frequency Range up to 1218 MHz",
+ "docsis_tlv.mcap.dipl_down_upper_band_edge.1218mhz",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1794,
+ {"Downstream Frequency Range up to 1794 MHz",
+ "docsis_tlv.mcap.dipl_down_upper_band_edge.1794mhz",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1002,
+ {"Downstream Frequency Range up to 1002 MHz",
+ "docsis_tlv.mcap.dipl_down_upper_band_edge.1002mhz",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge,
+ {".62 Diplexer Upstream Upper Band Edge",
+ "docsis_tlv.mcap.dipl_up_upper_band_edge",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Diplexer Upstream Upper Band Edge", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_42,
+ {"Upstream Frequency Range up to 42 MHz",
+ "docsis_tlv.mcap.dipl_up_upper_band_edge.42mhz",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_65,
+ {"Upstream Frequency Range up to 65 MHz",
+ "docsis_tlv.mcap.dipl_up_upper_band_edge.65mhz",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_85,
+ {"Upstream Frequency Range up to 85 MHz",
+ "docsis_tlv.mcap.dipl_up_upper_band_edge.85mhz",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_117,
+ {"Upstream Frequency Range up to 117 MHz",
+ "docsis_tlv.mcap.dipl_up_upper_band_edge.117mhz",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_204,
+ {"Upstream Frequency Range up to 204 MHz",
+ "docsis_tlv.mcap.dipl_up_upper_band_edge.204mhz",
+ FT_BOOLEAN, 8, NULL, 0x10,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_advanced_band_plan,
+ {".63 Advanced Band Plan",
+ "docsis_tlv.mcap.advanced_band_plan",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Advanced Band Plan", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_advanced_band_plan_fdx_l,
+ {"FDX-L support",
+ "docsis_tlv.mcap.advanced_band_plan.fdx_l",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_advanced_band_plan_fdx,
+ {"FDX support",
+ "docsis_tlv.mcap.advanced_band_plan.fdx",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_advanced_band_plan_fdd,
+ {"FDD support",
+ "docsis_tlv.mcap.advanced_band_plan.fdd",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_advanced_band_plan_reserved,
+ {"Reserved",
+ "docsis_tlv.mcap.advanced_band_plan.reserved",
+ FT_BOOLEAN, 8, NULL, 0xF8,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_ext_sf_cluster_assign_sup,
+ {".74 Extended Service Flow SID Cluster Assignments Support",
+ "docsis_tlv.mcap.ext_sf_cluster_assign_sup",
+ FT_UINT8, BASE_DEC, VALS(docsis_mcap_ext_sf_cluster_assign_sup_vals), 0x0,
+ "The ability of CM to handle TLV 89", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_low_latency_sup,
+ {".76 Low Latency Support",
+ "docsis_tlv.mcap.low_latancy_sup",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Low Latency Support", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_adv_down_lower_band_edge_conf,
+ {".79 Advanced Downstream Lower Band Edge Configuration",
+ "docsis_tlv.mcap.adv_down_lower_band_edge_conf",
+ FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &local_units_mhz, 0x0,
+ "Advanced Downstream Lower Band Edge Configuration", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_adv_down_upper_band_edge_conf,
+ {".80 Advanced Downstream Upper Band Edge Configuration",
+ "docsis_tlv.mcap.adv_down_upper_band_edge_conf",
+ FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &local_units_mhz, 0x0,
+ "Advanced Downstream Upper Band Edge Configuration", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_adv_up_upper_band_edge_conf,
+ {".81 Advanced Upstream Upper Band Edge Configuration",
+ "docsis_tlv.mcap.adv_up_upper_band_edge_conf",
+ FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &local_units_mhz, 0x0,
+ "Advanced Upstream Upper Band Edge Configuration", HFILL}
+ },
+ {&hf_docsis_tlv_mcap_adv_down_lower_band_edge_option,
+ {"Advanced Diplexer Downstream Lower Band Edge Option",
+ "docsis_tlv.mcap.adv_down_lower_band_edge_option",
+ FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &local_units_mhz, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_adv_down_upper_band_edge_option,
+ {"Advanced Diplexer Downstream Upper Band Edge Option",
+ "docsis_tlv.mcap.adv_down_upper_band_edge_option",
+ FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &local_units_mhz, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_adv_up_upper_band_edge_option,
+ {"Advanced Diplexer Upstream Upper Band Edge Option",
+ "docsis_tlv.mcap.adv_up_upper_band_edge_option",
+ FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &local_units_mhz, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_mcap_extended_power_options,
+ {".85 Extended Power Options",
+ "docsis_tlv.mcap.extended_power_options",
+ FT_UINT8, BASE_DEC, VALS(extended_power_options_vals), 0x0,
+ "Extended Power Options", HFILL}
+ },
+ {&hf_docsis_tlv_cm_mic,
+ {"6 CM MIC", "docsis_tlv.cmmic",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Cable Modem Message Integrity Check", HFILL}
+ },
+ {&hf_docsis_tlv_cmts_mic,
+ {"7 CMTS MIC", "docsis_tlv.cmtsmic",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "CMTS Message Integrity Check", HFILL}
+ },
+ {&hf_docsis_tlv_vendor_id,
+ {"8 Vendor ID", "docsis_tlv.vendorid",
+ FT_UINT24, BASE_OUI, NULL, 0x0,
+ "Vendor Identifier", HFILL}
+ },
+ {&hf_docsis_tlv_sw_file,
+ {"9 Software Upgrade File", "docsis_tlv.sw_upg_file",
+ FT_STRINGZ, BASE_NONE, NULL, 0x0,
+ "Software Upgrade File", HFILL}
+ },
+ {&hf_docsis_tlv_snmp_access,
+ {"10 SNMP Write Access", "docsis_tlv.snmp_access",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "SNMP Write Access", HFILL}
+ },
+ {&hf_docsis_tlv_snmp_obj,
+ {"11 SNMP Object", "docsis_tlv.snmp_obj",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "SNMP Object", HFILL}
+ },
+ {&hf_docsis_tlv_modem_addr,
+ {"12 Modem IP Address", "docsis_tlv.modemaddr",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "Modem IP Address", HFILL}
+ },
+ {&hf_docsis_tlv_svc_unavail,
+ {"13 Service Not Available Response", "docsis_tlv.svcunavail",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Service Not Available Response", HFILL}
+ },
+ {&hf_docsis_tlv_svc_unavail_classid,
+ {"Service Not Available: (Class ID)", "docsis_tlv.svcunavail.classid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Service Not Available (Class ID)", HFILL}
+ },
+ {&hf_docsis_tlv_svc_unavail_type,
+ {"Service Not Available (Type)", "docsis_tlv.svcunavail.type",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_svc_unavail_code,
+ {"Service Not Available (Code)", "docsis_tlv.svcunavail.code",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_cpe_ethernet,
+ {"14 CPE Ethernet Addr", "docsis_tlv.cpe_ether",
+ FT_ETHER, BASE_NONE, NULL, 0x0,
+ "CPE Ethernet Addr", HFILL}
+ },
+ {&hf_docsis_tlv_bpi,
+ {"17 Baseline Privacy Encoding", "docsis_tlv.bpi",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Baseline Privacy Encoding", HFILL}
+ },
+ {&hf_docsis_tlv_max_cpe,
+ {"18 Max # of CPE's", "docsis_tlv.maxcpe",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Max Number of CPE's", HFILL}
+ },
+ {&hf_docsis_tlv_tftp_server_timestamp,
+ {"19 TFTP Server Timestamp", "docsis_tlv.tftp_time",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "TFTP Server TimeStamp", HFILL}
+ },
+ {&hf_docsis_tlv_tftp_prov_modem_address,
+ {"20 TFTP Server Provisioned Modem Addr", "docsis_tlv.tftpmodemaddr",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "TFTP Server Provisioned Modem Addr", HFILL}
+ },
+ {&hf_docsis_tlv_sw_upg_srvr,
+ {"21 Software Upgrade Server", "docsis_tlv.sw_upg_srvr",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "Software Upgrade Server", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_upclsfr,
+ {"22 Upstream Classifier", "docsis_tlv.upclsfr",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_downclsfr,
+ {"23 Downstream Classifier", "docsis_tlv.downclsfr",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_clsfr_ref,
+ {".1 Classifier Ref", "docsis_tlv.clsfr.ref",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Classifier Reference", HFILL}
+ },
+ {&hf_docsis_tlv_clsfr_id,
+ {".2 Classifier ID", "docsis_tlv.clsfr.id",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Classifier ID", HFILL}
+ },
+ {&hf_docsis_tlv_clsfr_sflow_ref,
+ {".3 Service Flow Ref", "docsis_tlv.clsfr.sflowref",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Service Flow Reference", HFILL}
+ },
+ {&hf_docsis_tlv_clsfr_sflow_id,
+ {".4 Service Flow ID", "docsis_tlv.clsfr.sflowid",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Service Flow ID", HFILL}
+ },
+ {&hf_docsis_tlv_clsfr_rule_pri,
+ {".5 Rule Priority", "docsis_tlv.clsfr.rulepri",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Rule Priority", HFILL}
+ },
+ {&hf_docsis_tlv_clsfr_act_state,
+ {".6 Activation State", "docsis_tlv.clsfr.actstate",
+ FT_BOOLEAN, BASE_NONE, TFS (&tfs_active_inactive), 0x0,
+ "Classifier Activation State", HFILL}
+ },
+ {&hf_docsis_tlv_clsfr_dsc_act,
+ {".7 DSC Action", "docsis_tlv.clsfr.dscact",
+ FT_UINT8, BASE_DEC, VALS (dsc_act_vals), 0x0,
+ "Dynamic Service Change Action", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_clsfr_err,
+ {".8 Error Encodings", "docsis_tlv.clsfr.err",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Error Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_clsfr_err_param,
+ {"..1 Param Subtype", "docsis_tlv.clsfr.err.param",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Parameter Subtype", HFILL}
+ },
+ {&hf_docsis_tlv_clsfr_err_code,
+ {"..2 Error Code", "docsis_tlv.clsfr.err.code",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
+ "Error Code", HFILL}
+ },
+ {&hf_docsis_tlv_clsfr_err_msg,
+ {"..3 Error Message", "docsis_tlv.clsfr.err.msg",
+ FT_STRINGZ, BASE_NONE, NULL, 0x0,
+ "Error Message", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_ipclsfr,
+ {".9 IP Classifier Encodings", "docsis_tlv.clsfr.ip",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "IP Classifier Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_ipclsfr_tosmask,
+ {"..1 Type Of Service Mask", "docsis_tlv.clsfr.ip.tosmask",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Type Of Service Mask", HFILL}
+ },
+ {&hf_docsis_tlv_ipclsfr_ipproto,
+ {"..2 IP Protocol", "docsis_tlv.clsfr.ip.ipproto",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "IP Protocol", HFILL}
+ },
+ {&hf_docsis_tlv_ipclsfr_src,
+ {"..3 Source Address", "docsis_tlv.clsfr.ip.src",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "Source Address", HFILL}
+ },
+ {&hf_docsis_tlv_ipclsfr_dst,
+ {"..4 Destination Address", "docsis_tlv.clsfr.ip.dst",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "Destination Address", HFILL}
+ },
+ {&hf_docsis_tlv_ipclsfr_srcmask,
+ {"..5 Source Mask", "docsis_tlv.clsfr.ip.smask",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "Source Mask", HFILL}
+ },
+ {&hf_docsis_tlv_ipclsfr_dstmask,
+ {"..6 Destination Mask", "docsis_tlv.clsfr.ip.dmask",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "Destination Mask", HFILL}
+ },
+ {&hf_docsis_tlv_ipclsfr_sport_start,
+ {"..7 Source Port Start", "docsis_tlv.clsfr.ip.sportstart",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "TCP/UDP Source Port Start", HFILL}
+ },
+ {&hf_docsis_tlv_ipclsfr_sport_end,
+ {"..8 Source Port End", "docsis_tlv.clsfr.ip.sportend",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "TCP/UDP Source Port End", HFILL}
+ },
+ {&hf_docsis_tlv_ipclsfr_dport_start,
+ {"..9 Dest Port Start", "docsis_tlv.clsfr.ip.dportstart",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "TCP/UDP Destination Port Start", HFILL}
+ },
+ {&hf_docsis_tlv_ipclsfr_dport_end,
+ {"..10 Dest Port End", "docsis_tlv.clsfr.ip.dportend",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "TCP/UDP Destination Port End", HFILL}
+ },
+ {&hf_docsis_tlv_ip6clsfr_tc_low,
+ {"tc-low", "docsis_tlv.clsfr.ip6.tc.low",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_ip6clsfr_tc_high,
+ {"tc-high", "docsis_tlv.clsfr.ip6.tc.high",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_ip6clsfr_tc_mask,
+ {"tc-mask", "docsis_tlv.clsfr.ip6.tc.mask",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_ip6clsfr_flow_label,
+ {"..2 Flow Label", "docsis_tlv.clsfr.ip6.flowlabel",
+ FT_UINT32, BASE_HEX, NULL, 0x0,
+ "Flow Label", HFILL}
+ },
+ {&hf_docsis_tlv_ip6clsfr_next_header,
+ {"..3 Next Header", "docsis_tlv.clsfr.ip6.nextheader",
+ FT_UINT16, BASE_DEC, VALS(next_header_vals), 0x0,
+ "Next Header", HFILL}
+ },
+ {&hf_docsis_tlv_ip6clsfr_src,
+ {"..4 Source Address", "docsis_tlv.clsfr.ip6.src",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "Source Address", HFILL}
+ },
+ {&hf_docsis_tlv_ip6clsfr_src_prefix_length,
+ {"..5 Source Prefix Length", "docsis_tlv.clsfr.ip6.src_prefix_length",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Source Prefix Length", HFILL}
+ },
+ {&hf_docsis_tlv_ip6clsfr_dst,
+ {"..6 Destination Address", "docsis_tlv.clsfr.ip6.dst",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "Destination Address", HFILL}
+ },
+ {&hf_docsis_tlv_ip6clsfr_dst_prefix_length,
+ {"..7 Destination Prefix Length", "docsis_tlv.clsfr.ip6.dst_prefix_length",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Destination Prefix Length", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_ethclsfr,
+ {".10 Ethernet Classifier Encodings", "docsis_tlv.clsfr.eth",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Ethernet Classifier Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_ethclsfr_dmac,
+ {"..1 Dest MAC Address", "docsis_tlv.clsfr.eth.dmac",
+ FT_ETHER, BASE_NONE, NULL, 0x0,
+ "Destination MAC Address", HFILL}
+ },
+ {&hf_docsis_tlv_ethclsfr_smac,
+ {"..2 Source MAC Address", "docsis_tlv.clsfr.eth.smac",
+ FT_ETHER, BASE_NONE, NULL, 0x0,
+ "Source MAC Address", HFILL}
+ },
+ {&hf_docsis_tlv_ethclsfr_ethertype,
+ {"..3 Ethertype", "docsis_tlv.clsfr.eth.ethertype",
+ FT_UINT24, BASE_HEX, NULL, 0x0,
+ "Ethertype", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_dot1qclsfr,
+ {".11 802.1Q Classifier Encodings", "docsis_tlv.clsfr.dot1q",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "802.1Q Classifier Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_dot1qclsfr_user_pri,
+ {"..1 User Priority", "docsis_tlv.clsfr.dot1q.userpri",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "User Priority", HFILL}
+ },
+ {&hf_docsis_tlv_dot1qclsfr_vlanid,
+ {"..2 VLAN ID", "docsis_tlv.clsfr.dot1q.ethertype",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "VLAN ID", HFILL}
+ },
+ {&hf_docsis_tlv_dot1qclsfr_vendorspec,
+ {"..43 Vendor Specific Encodings", "docsis_tlv.clsfr.dot1q.vendorspec",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Vendor Specific Encodings", HFILL}
+ },
+ {&hf_docsis_tlv_clsfr_vendor_spc,
+ {".43 Vendor Specific Encodings", "docsis_tlv.clsfr.vendor",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Vendor Specific Encodings", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_upsflow,
+ {"24 Upstream Service Flow", "docsis_tlv.upsflow",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_downsflow,
+ {"25 Downstream Service Flow", "docsis_tlv.downsflow",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_sflow_ref,
+ {".1 Service Flow Ref", "docsis_tlv.sflow.ref",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Service Flow Reference", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_id,
+ {".2 Service Flow ID", "docsis_tlv.sflow.id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Service Flow ID", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_sid,
+ {".3 Service Identifier", "docsis_tlv.sflow.sid",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Service Identifier", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_classname,
+ {".4 Service Class Name", "docsis_tlv.sflow.cname",
+ FT_STRINGZ, BASE_NONE, NULL, 0x0,
+ "Service Class Name", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_sflow_err,
+ {".5 Error Encodings", "docsis_tlv.sflow.err",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Error Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_sflow_err_param,
+ {"..1 Param Subtype", "docsis_tlv.sflow.err.param",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Parameter Subtype", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_err_code,
+ {"..2 Error Code", "docsis_tlv.sflow.err.code",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
+ "Error Code", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_err_msg,
+ {"..3 Error Message", "docsis_tlv.sflow.err.msg",
+ FT_STRINGZ, BASE_NONE, NULL, 0x0,
+ "Error Message", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_qos_param,
+ {".6 QOS Parameter Set", "docsis_tlv.sflow.qos",
+ FT_UINT8, BASE_HEX, VALS (qos_param_vals), 0x0,
+ "QOS Parameter Set", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_traf_pri,
+ {".7 Traffic Priority", "docsis_tlv.sflow.trafpri",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Traffic Priority", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_max_sus,
+ {".8 Maximum Sustained Traffic Rate (bps)", "docsis_tlv.sflow.maxtrafrate",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Maximum Sustained Traffic Rate (bps)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_max_burst,
+ {".9 Maximum Burst (bps)", "docsis_tlv.sflow.maxburst",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Maximum Burst (bps)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_min_traf,
+ {".10 Minimum Traffic Rate (bps)", "docsis_tlv.sflow.mintrafrate",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Minimum Traffic Rate (bps)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_ass_min_pkt_size,
+ {".11 Assumed Min Reserved Packet Size", "docsis_tlv.sflow.assumed_min_pkt_size",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Assumed Minimum Reserved Packet Size", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_timeout_active,
+ {".12 Timeout for Active Params (secs)", "docsis_tlv.sflow.act_timeout",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Timeout for Active Params (secs)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_timeout_admitted,
+ {".13 Timeout for Admitted Params (secs)", "docsis_tlv.sflow.adm_timeout",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Timeout for Admitted Params (secs)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_max_down_latency,
+ {".14 Maximum Downstream Latency (usec)", "docsis_tlv.sflow.max_down_lat",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Maximum Downstream Latency (usec)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_max_concat_burst,
+ {".14 Max Concat Burst", "docsis_tlv.sflow.maxconcat",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Max Concatenated Burst", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_sched_type,
+ {".15 Scheduling Type", "docsis_tlv.sflow.schedtype",
+ FT_UINT32, BASE_HEX, VALS (sched_type_vals), 0x0,
+ "Scheduling Type", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_down_reseq,
+ {".17 Downstream Resequencing", "docsis_tlv.sflow.down_reseq",
+ FT_UINT8, BASE_DEC, VALS(down_reseq_vals), 0x0,
+ "Downstream Resequencing", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_pol,
+ {".16 Request/Transmission Policy", "docsis_tlv.sflow.reqxmitpol",
+ FT_UINT32, BASE_HEX, NULL, 0x0,
+ "Request/Transmission Policy", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_all_cm_broadcast,
+ {"Service flow use \"all CMs\" broadcast request opportunities", "docsis_tlv.sflow.reqxmitpol.all_cm_broadcast",
+ FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000001,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_priority_multicast,
+ {"Service flow use priority multicast request opportunities", "docsis_tlv.sflow.reqxmitpol.priority_multicast",
+ FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000002,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_req_data_requests,
+ {"Service flow use Request/Data opportunities for requests", "docsis_tlv.sflow.reqxmitpol.req_data_requests",
+ FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000004,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_req_data_data,
+ {"Service flow use Request/Data opportunities for data", "docsis_tlv.sflow.reqxmitpol.req_data_data",
+ FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000008,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_piggy_back,
+ {"Service flow use piggy back requests with data", "docsis_tlv.sflow.reqxmitpol.piggy_back",
+ FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000010,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_concatenate_data,
+ {"Service flow concatenate data", "docsis_tlv.sflow.reqxmitpol.concatenate_data",
+ FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000020,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_fragment,
+ {"Service flow fragment data", "docsis_tlv.sflow.reqxmitpol.fragment",
+ FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000040,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_suppress_payload,
+ {"Service flow suppress payload headers", "docsis_tlv.sflow.reqxmitpol.suppress_payload",
+ FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000080,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_sflow_reqxmit_drop_packets,
+ {"Service flow drop packets that do not fit in the UGS size", "docsis_tlv.sflow.reqxmitpol.drop_packets",
+ FT_BOOLEAN, 32, TFS(&tfs_must_must_not), 0x00000100,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_sflow_nominal_polling,
+ {".17 Nominal Polling Interval(usec)", "docsis_tlv.sflow.nominal_polling",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Nominal Polling Interval(usec)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_tolerated_jitter,
+ {".18 Tolerated Poll Jitter (usec)", "docsis_tlv.sflow.toler_jitter",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Tolerated Poll Jitter (usec)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_ugs_size,
+ {".19 Unsolicited Grant Size (bytes)", "docsis_tlv.sflow.ugs_size",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Unsolicited Grant Size (bytes)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_nom_grant_intvl,
+ {".20 Nominal Grant Interval (usec)", "docsis_tlv.sflow.nom_grant_intvl",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Nominal Grant Interval (usec)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_tol_grant_jitter,
+ {".21 Tolerated Grant Jitter (usec)", "docsis_tlv.sflow.tol_grant_jitter",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Tolerated Grant Jitter (usec)", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_grants_per_intvl,
+ {".22 Grants Per Interval", "docsis_tlv.sflow.grnts_per_intvl",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Grants Per Interval", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_ip_tos_overwrite,
+ {".23 IP TOS Overwrite", "docsis_tlv.sflow.iptos_overwrite",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "IP TOS Overwrite", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_ugs_timeref,
+ {".24 UGS Time Reference", "docsis_tlv.sflow.ugs_timeref",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "UGS Time Reference", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_cont_req_backoff_window_mult,
+ {".25 Multiplier to Contention Request Backoff Window", "docsis_tlv.sflow.cont_req_backoff_window_mult",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Multiplier to Contention Request Backoff Window", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_num_of_bytes_requested_mult,
+ {".26 Multiplier to Number of Bytes Requested", "docsis_tlv.sflow.num_of_bytes_requested_mult",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Multiplier to Number of Bytes Requested", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_peak_traffic_rate,
+ {".27 Peak Traffic Rate", "docsis_tlv.sflow.peak_traffic_rate",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Peak Traffic Rate", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_req_attr_mask,
+ {".31 Required Attribute Mask", "docsis_tlv.sflow.req_attr_mask",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Required Attribute Mask", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_forb_attr_mask,
+ {".32 Forbidden Attribute Mask", "docsis_tlv.sflow.forb_attr_mask",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Forbidden Attribute Mask", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_attr_aggr_rule_mask,
+ {".33 Attribute Aggregation Rule Mask", "docsis_tlv.sflow.attr_aggr_rule_mask",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Attribute Aggregation Rule Mask", HFILL}
+ },
+ {&hf_docsis_tlv_sflow_vendor_spec,
+ {".43 Vendor Specific Encodings", "docsis_tlv.sflow.vendorspec",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Vendor Specific Encodings", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_phs,
+ {"26 PHS Rules", "docsis_tlv.phs",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "PHS Rules", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_phs_class_ref,
+ {".1 Classifier Reference", "docsis_tlv.phs.classref",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Classifier Reference", HFILL}
+ },
+ {&hf_docsis_tlv_phs_class_id,
+ {".2 Classifier ID", "docsis_tlv.phs.classid",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Classifier ID", HFILL}
+ },
+ {&hf_docsis_tlv_phs_sflow_ref,
+ {".3 Service flow reference", "docsis_tlv.phs.sflowref",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Service Flow Reference", HFILL}
+ },
+ {&hf_docsis_tlv_phs_sflow_id,
+ {".4 Service flow ID", "docsis_tlv.phs.sflowid",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Service Flow ID", HFILL}
+ },
+ {&hf_docsis_tlv_phs_dsc_action,
+ {".5 DSC Action", "docsis_tlv.phs.dscaction",
+ FT_UINT8, BASE_DEC, VALS (action_vals), 0x0,
+ "Dynamic Service Change Action", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_phs_err,
+ {".6 Error Encodings", "docsis_tlv.phs.err",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Error Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_phs_err_param,
+ {"..1 Param Subtype", "docsis_tlv.phs.err.param",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Parameter Subtype", HFILL}
+ },
+ {&hf_docsis_tlv_phs_err_code,
+ {"..2 Error Code", "docsis_tlv.phs.err.code",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Error Code", HFILL}
+ },
+ {&hf_docsis_tlv_phs_err_msg,
+ {"..3 Error Message", "docsis_tlv.phs.err.msg",
+ FT_STRINGZ, BASE_NONE, NULL, 0x0,
+ "Error Message", HFILL}
+ },
+ {&hf_docsis_tlv_phs_phsf,
+ {".7 PHS Field", "docsis_tlv.phs.phsf",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "PHS Field", HFILL}
+ },
+ {&hf_docsis_tlv_phs_phsi,
+ {".8 PHS Index", "docsis_tlv.phs.phsi",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "PHS Index", HFILL}
+ },
+ {&hf_docsis_tlv_phs_phsm,
+ {".9 PHS Mask", "docsis_tlv.phs.phsm",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "PHS Mask", HFILL}
+ },
+ {&hf_docsis_tlv_phs_phss,
+ {".10 PHS Size", "docsis_tlv.phs.phss",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "PHS Size", HFILL}
+ },
+ {&hf_docsis_tlv_phs_dbc_action,
+ {".13 PHS Dynamic Bonding Change Action", "docsis_tlv.phs.dbc_action",
+ FT_UINT8, BASE_DEC, VALS (dbc_action_vals), 0x0,
+ "PHS Dynamic Bonding Change Action", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_phs_phsv,
+ {".11 PHS Verify", "docsis_tlv.phs.phsv",
+ FT_BOOLEAN, BASE_NONE, TFS (&verify_tfs), 0x0,
+ "PHS Verify", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_phs_vendorspec,
+ {".43 PHS Vendor Specific", "docsis_tlv.phs.vendorspec",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "PHS Vendor Specific", HFILL}
+ },
+ {&hf_docsis_tlv_hmac_digest,
+ {"27 HMAC Digest", "docsis_tlv.hmac_digest",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "HMAC Digest", HFILL}
+ },
+ {&hf_docsis_tlv_max_classifiers,
+ {"28 Max # of Classifiers", "docsis_tlv.maxclass",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Max # of Classifiers", HFILL}
+ },
+ {&hf_docsis_tlv_privacy_enable,
+ {"29 Privacy Enable", "docsis_tlv.bpi_en",
+ FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
+ "Privacy Enable", HFILL}
+ },
+ {&hf_docsis_tlv_auth_block,
+ {"30 Auth Block", "docsis_tlv.auth_block",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Auth Block", HFILL}
+ },
+ {&hf_docsis_tlv_key_seq_num,
+ {"31 Key Sequence Number", "docsis_tlv.key_seq",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Key Sequence Number", HFILL}
+ },
+ {&hf_docsis_tlv_mfgr_cvc,
+ {"32 Manufacturer CVC", "docsis_tlv.mfgr_cvc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Manufacturer CVC", HFILL}
+ },
+ {&hf_docsis_tlv_cosign_cvc,
+ {"33 Co-Signer CVC", "docsis_tlv.cosign_cvc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Co-Signer CVC", HFILL}
+ },
+ {&hf_docsis_tlv_snmpv3_kick,
+ {"34 SNMPv3 Kickstart Value", "docsis_tlv.snmpv3",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "SNMPv3 Kickstart Value", HFILL}
+ },
+ {&hf_docsis_tlv_snmpv3_kick_name,
+ {".1 SNMPv3 Kickstart Security Name", "docsis_tlv.snmpv3.secname",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "SNMPv3 Kickstart Security Name", HFILL}
+ },
+ {&hf_docsis_tlv_snmpv3_kick_publicnum,
+ {".2 SNMPv3 Kickstart Manager Public Number", "docsis_tlv.snmpv3.publicnum",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "SNMPv3 Kickstart Value Manager Public Number", HFILL}
+ },
+ {&hf_docsis_tlv_subs_mgmt_ctrl,
+ {"35 Subscriber Management Control", "docsis_tlv.subsmgmtctrl",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Subscriber Management Control", HFILL}
+ },
+ {&hf_docsis_tlv_subs_mgmt_ip_table,
+ {"36 Subscriber Management CPE IP Table", "docsis_tlv.subsiptable",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Subscriber Management CPE IP Table", HFILL}
+ },
+ {&hf_docsis_tlv_subs_mgmt_ip_entry,
+ {"Subscriber Management CPE IP Entry", "docsis_tlv.subsipentry",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_subs_mgmt_filter_grps,
+ {"37 Subscriber Management Filter Groups", "docsis_tlv.subsfltrgrps",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Subscriber Management Filter Groups", HFILL}
+ },
+ {&hf_docsis_tlv_snmpv3_ntfy_rcvr,
+ {"38 SNMPv3 Notification Receiver", "docsis_tlv.snmpv3ntfy",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "SNMPv3 Notification Receiver", HFILL}
+ },
+ {&hf_docsis_tlv_enable_20_mode,
+ {"39 Enable 2.0 Mode", "docsis_tlv.enable20mode",
+ FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
+ "Enable 2.0 Mode", HFILL}
+ },
+ {&hf_docsis_tlv_enable_test_modes,
+ {"40 Enable Test Modes", "docsis_tlv.enabletestmodes",
+ FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
+ "Enable Test Modes", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_ds_ch_list,
+ {"41 Downstream Channel List", "docsis_tlv.dschlist",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_ds_ch_list_single,
+ {".1 Single Downstream Channel", "docsis_tlv.dschlist.single",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_single_ch_timeout,
+ {"..1 Timeout", "docsis_tlv.dschlist.single.timeout",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Timeout", HFILL}
+ },
+ {&hf_docsis_tlv_single_ch_freq,
+ {"..2 Timeout", "docsis_tlv.dschlist.single.freq",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Timeout", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_ds_ch_list_range,
+ {".2 Downstream Frequency Range", "docsis_tlv.dschlist.range",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_freq_rng_timeout,
+ {"..1 Timeout", "docsis_tlv.dschlist.range.timeout",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Timeout", HFILL}
+ },
+ {&hf_docsis_tlv_freq_rng_start,
+ {"..2 Frequency Start", "docsis_tlv.dschlist.range.start",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Frequency Start", HFILL}
+ },
+ {&hf_docsis_tlv_freq_rng_end,
+ {"..3 Frequency Start", "docsis_tlv.dschlist.range.end",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Frequency End", HFILL}
+ },
+ {&hf_docsis_tlv_freq_rng_step,
+ {"..4 Frequency Step Size", "docsis_tlv.dschlist.range.step",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Frequency Step Size", HFILL}
+ },
+ {&hf_docsis_tlv_ds_ch_list_default_timeout,
+ {".3 Default Scanning Timeout", "docsis_tlv.dschlist.defaulttimeout",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Default Scanning Timeout", HFILL}
+ },
+ {&hf_docsis_tlv_mc_mac_address,
+ {"42 Static Multicast MAC Address", "docsis_tlv.mcmac",
+ FT_ETHER, BASE_NONE, NULL, 0x0,
+ "Static Multicast MAC Address", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_vendor_spec,
+ {"43 Vendor Specific Encodings", "docsis_tlv.vendorspec",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Vendor Specific Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_rng_tech,
+ {"Ranging Technique", "docsis_tlv.rng_tech",
+ FT_UINT8, BASE_DEC, VALS (rng_tech_vals), 0x0,
+ NULL, HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_dut_filter,
+ {"45 Downstream Unencrypted Traffic Filtering Encoding", "docsis_tlv.dut",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Downstream Unencrypted Traffic Filtering Encoding", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_dut_filter_control,
+ {".1 DUT Control", "docsis_tlv.dut.control",
+ FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
+ "DUT Control", HFILL}
+ },
+ {&hf_docsis_tlv_dut_filter_cmim,
+ {".2 DUT CMIM", "docsis_tlv.dut.cmim",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "DUT CMIM", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_tcc,
+ {"46 Transmit Channel Configuration", "docsis_tlv.tcc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Transmit Channel Configuration", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_tcc_refid,
+ {".1 TCC Reference ID", "docsis_tlv.tcc.refid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "TCC Reference ID", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_us_ch_action,
+ {".2 Upstream Channel Action", "docsis_tlv.tcc.uschact",
+ FT_UINT8, BASE_DEC, VALS (us_ch_action_vals), 0x0,
+ "Upstream Channel Action", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_us_ch_id,
+ {".3 Upstream Channel ID", "docsis_tlv.tcc.uschid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Upstream Channel ID", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_new_us_ch_id,
+ {".4 New Upstream Channel ID", "docsis_tlv.tcc.newuschid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "New Upstream Channel ID", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_ucd,
+ {".5 Upstream Channel Descriptor", "docsis_tlv.tcc.ucd",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Upstream Channel Descriptor", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_rng_sid,
+ {".6 Ranging SID", "docsis_tlv.tcc.rngsid",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Ranging SID", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_init_tech,
+ {".7 Initialization Technique", "docsis_tlv.tcc.inittech",
+ FT_UINT8, BASE_DEC, VALS (init_tech_vals), 0x0,
+ "Initialization Technique", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_tcc_rng_parms,
+ {".8 Ranging Parameters", "docsis_tlv.tcc.rngparms",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Ranging Parameters", HFILL}
+ },
+#endif
+ {&hf_docsis_rng_parms_us_ch_id,
+ {"..1 Ranging Reference Channel ID", "docsis_tlv.tcc.rngparms.uschid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Upstream Channel ID", HFILL}
+ },
+ {&hf_docsis_rng_parms_time_off_int,
+ {"..2 Timing Offset, Integer Part", "docsis_tlv.tcc.rngparms.timeoffint",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Timing Offset, Integer Part", HFILL}
+ },
+ {&hf_docsis_rng_parms_time_off_frac,
+ {"..3 Timing Offset, Fractional Part", "docsis_tlv.tcc.rngparms.timeofffrac",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Timing Offset, Fractional Part", HFILL}
+ },
+ {&hf_docsis_rng_parms_power_off,
+ {"..4 Power Offset", "docsis_tlv.tcc.rngparms.poweroff",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Power Offset", HFILL}
+ },
+ {&hf_docsis_rng_parms_freq_off,
+ {"..5 Frequency Offset", "docsis_tlv.tcc.rngparms.freqoff",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Frequency Offset", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_dyn_rng_win,
+ {".9 Dynamic Range Window", "docsis_tlv.tcc.dynrngwin",
+ FT_UINT8, BASE_CUSTOM, CF_FUNC(fourth_db), 0x0,
+ "Dynamic Range Window", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_p_16hi,
+ {".10 P1.6hi", "docsis_tlv.tcc.p16hi",
+ FT_UINT8, BASE_CUSTOM, CF_FUNC(fourth_dbmv), 0x0,
+ "P1.6hi", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_oudp_iuc,
+ {"OUDP IUC", "docsis_tlv.tcc.oudp_iuc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_tcc_extended_drw,
+ {".14 Extended Dynamic Range Window", "docsis_tlv.tcc.extended_dynrngwin",
+ FT_UINT8, BASE_CUSTOM, CF_FUNC(fourth_db), 0x0,
+ "Extended Dynamic Range Window", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_extended_us_rng_pwr,
+ {".15 Extended US Ranging Power", "docsis_tlv.tcc.extended_us_rng_pwr",
+ FT_UINT16, BASE_CUSTOM, CF_FUNC(fourth_db), 0x0,
+ "Extended US Ranging Power", HFILL}
+ },
+ {&hf_docsis_tlv_tcc_oudp_sounding_sid,
+ {".16 OUDP Sounding SID", "docsis_tlv.tcc.oudp_sounding_sid",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "OUDP Sounding SID", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_tcc_err,
+ {".10 TCC Error Encodings", "docsis_tlv.tcc.err",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "TCC Error Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tcc_err_subtype,
+ {"..1 TCC Subtype", "docsis_tlv.tcc.err.subtype",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "TCC Subtype", HFILL}
+ },
+ {&hf_docsis_tcc_err_code,
+ {"..2 Error Code", "docsis_tlv.tcc.err.code",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
+ "Error Code", HFILL}
+ },
+ {&hf_docsis_tcc_err_msg,
+ {"..3 Error Message", "docsis_tlv.tcc.err.msg",
+ FT_STRINGZ, BASE_NONE, NULL, 0x0,
+ "Error Message", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_sid_cl,
+ {"47 Service Flow SID Cluster Assignments", "docsis_tlv.sid",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Service Flow SID Cluster Assignments", HFILL}
+ },
+#endif
+ {&hf_docsis_sid_cl_sf_id,
+ {".1 Service Flow ID", "docsis_tlv.sid.sfid",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Upstream Channel ID", HFILL}
+ },
+#if 0
+ {&hf_docsis_sid_cl_enc,
+ {".2 SID Cluster Encodings", "docsis_tlv.sid.enc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "SID Cluster Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_sid_cl_enc_id,
+ {"..1 SID Cluster ID", "docsis_tlv.sid.enc.id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "SID Cluster ID", HFILL}
+ },
+#if 0
+ {&hf_docsis_sid_cl_enc_map,
+ {"..2 SID-to-Channel Mapping", "docsis_tlv.sid.enc.map",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "SID Cluster ID", HFILL}
+ },
+#endif
+ {&hf_docsis_sid_cl_map_us_ch_id,
+ {"...1 Upstream Channel ID", "docsis_tlv.sid.enc.map.uschid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Upstream Channel ID", HFILL}
+ },
+ {&hf_docsis_sid_cl_map_sid,
+ {"...2 SID", "docsis_tlv.sid.enc.map.sid",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "SID", HFILL}
+ },
+ {&hf_docsis_sid_cl_map_action,
+ {"...3 SID-to-Channel Mapping Action", "docsis_tlv.sid.enc.map.action",
+ FT_UINT8, BASE_DEC, VALS (sid_ch_map_vals), 0x0,
+ "SID-to-Channel Mapping Action", HFILL}
+ },
+#if 0
+ {&hf_docsis_sid_cl_so_crit,
+ {".3 SID Cluster Switchover Criteria", "docsis_tlv.sid.socrit",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "SID Cluster Switchover Criteria", HFILL}
+ },
+#endif
+ {&hf_docsis_sid_cl_so_max_req,
+ {"..1 Maximum Requests per SID Cluster", "docsis_tlv.sid.socrit.maxreq",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Maximum Requests per SID Cluster", HFILL}
+ },
+ {&hf_docsis_sid_cl_so_max_out_bytes,
+ {"..2 Maximum Outstanding Bytes per SID Cluster", "docsis_tlv.sid.socrit.maxoutbytes",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Maximum Outstanding Bytes per SID Cluster", HFILL}
+ },
+ {&hf_docsis_sid_cl_so_max_req_bytes,
+ {"..3 Maximum Total Bytes Requested per SID Cluster", "docsis_tlv.sid.socrit.maxreqbytes",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Maximum Total Bytes Requested per SID Cluster", HFILL}
+ },
+ {&hf_docsis_sid_cl_so_max_time,
+ {"..4 Maximum Time in the SID Cluster", "docsis_tlv.sid.socrit.maxtime",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Maximum Time in the SID Cluster", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_rcp,
+ {"48 Receive Channel Profile", "docsis_tlv.rcp",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Channel Profile", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_rcp_id,
+ {".1 RCP-ID", "docsis_tlv.rcp.id",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "RCP-ID", HFILL}
+ },
+ {&hf_docsis_tlv_rcp_name,
+ {".2 RCP Name", "docsis_tlv.rcp.name",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "RCP Name", HFILL}
+ },
+ {&hf_docsis_tlv_rcp_freq_spc,
+ {".3 RCP Center Frequency Spacing", "docsis_tlv.rcp.freq_spc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "RCP Center Frequency Spacing", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_rcp_rcv_mod_enc,
+ {".4 Receive Module Capability", "docsis_tlv.rcp.rcv_mod_enc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Module Encoding", HFILL}
+ },
+#endif
+ {&hf_docsis_rcv_mod_enc_idx,
+ {"..1 Receive Module Index", "docsis_tlv.rcp.rcv_mod_enc.idx",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Receive Module Index", HFILL}
+ },
+ {&hf_docsis_rcv_mod_enc_adj_ch,
+ {"..2 Adjacent Channels", "docsis_tlv.rcp.rcv_mod_enc.adj_ch",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Adjacent Channels", HFILL}
+ },
+#if 0
+ {&hf_docsis_rcv_mod_enc_ch_bl_rng,
+ {"..3 Channel Block Range", "docsis_tlv.rcp.rcv_mod_enc.ch_bl_rng",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Channel Block Range", HFILL}
+ },
+#endif
+ {&hf_docsis_rcv_mod_enc_ctr_freq_asgn,
+ {"..4 First Channel Center Frequency Assignment", "docsis_tlv.rcv_mod_enc.ctr_freq_asgn",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "First Channel Center Frequency Assignment", HFILL}
+ },
+ {&hf_docsis_ch_bl_rng_min_ctr_freq,
+ {"...1 Minimum Center Frequency", "docsis_tlv.rcp.rcv_mod_enc.ch_bl_rng.min_ctr_freq",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Minimum Center Frequency", HFILL}
+ },
+ {&hf_docsis_ch_bl_rng_max_ctr_freq,
+ {"...2 Maximum Center Frequency", "docsis_tlv.rcp.rcv_mod_enc.ch_bl_rng.max_ctr_freq",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Maximum Center Frequency", HFILL}
+ },
+ {&hf_docsis_rcv_mod_enc_rsq_ch_subs_cap ,
+ {"..5 Resequencing Channel Subset Capability", "docsis_tlv.rcp.rcv_mod_enc.rsq_ch_subs_cap",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Resequencing Channel Subset Capability", HFILL}
+ },
+ {&hf_docsis_rcv_mod_enc_conn ,
+ {"..6 Receive Module Connectivity", "docsis_tlv.rcp.rcv_mod_enc.conn",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Module Connectivity", HFILL}
+ },
+ {&hf_docsis_rcv_mod_enc_phy_layr_parms,
+ {"..7 Physical Layer Parameter", "docsis_tlv.rcp.rcv_mod_enc.phy_layr_parms",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Physical Layer Parameter", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_rcp_rcv_ch,
+ {".5 Receive Channel", "docsis_tlv.rcp.rcv_ch",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Channel", HFILL}
+ },
+#endif
+ {&hf_docsis_rcv_ch_idx,
+ {"..1 Receive Channel Index", "docsis_tlv.rcp.rcv_ch.idx",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Receive Channel Index", HFILL}
+ },
+ {&hf_docsis_rcv_ch_conn,
+ {"..2 Receive Channel Connectivity", "docsis_tlv.rcp.rcv_ch.conn",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Channel Connectivity", HFILL}
+ },
+ {&hf_docsis_rcv_ch_conn_off,
+ {"..3 Receive Channel Connected Offset", "docsis_tlv.rcp.rcv_ch.conn_off",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Receive Channel Connected Offset", HFILL}
+ },
+ {&hf_docsis_rcv_ch_prim_ds_ch_ind,
+ {"..5 Primary Downstream Channel Indicator", "docsis_tlv.rcp.rcv_ch.prim_ds_ch_ind",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Primary Downstream Channel Indicator", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_rcp_ven_spec,
+ {".43 Vendor Specific Encodings", "docsis_tlv.rcp.vendorspec",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Vendor Specific Encodings", HFILL}
+ },
+ {&hf_docsis_tlv_rcc,
+ {"49 Receive Channel Configuration", "docsis_tlv.rcc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Channel Configuration", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_rcc_id,
+ {".1 Assigned RCP-ID", "docsis_tlv.rcc.id",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Assigned RCP-ID", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_rcc_rcv_mod_enc,
+ {".4 Receive Module Assignment", "docsis_tlv.rcc.rcv_mod_enc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Module Assignment", HFILL}
+ },
+#endif
+ {&hf_docsis_rcc_rcv_mod_enc_idx,
+ {"..1 Receive Module Index", "docsis_tlv.rcc.rcc_rcv_mod_enc.idx",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Receive Module Index", HFILL}
+ },
+ {&hf_docsis_rcc_rcv_mod_enc_ctr_freq_asgn,
+ {"..4 First Channel Center Frequency Assignment", "docsis_tlv.rcc.rcv_mod_enc.ctr_freq_asgn",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "First Channel Center Frequency Assignment", HFILL}
+ },
+ {&hf_docsis_rcc_rcv_mod_enc_conn ,
+ {"..6 Receive Module Connectivity", "docsis_tlv.rcc.rcv_mod_enc.conn",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Module Connectivity", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_rcc_rcv_ch,
+ {".5 Receive Channel", "docsis_tlv.rcc.rcv_ch",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Channel", HFILL}
+ },
+#endif
+ {&hf_docsis_rcc_rcv_ch_idx,
+ {"..1 Receive Channel Index", "docsis_tlv.rcc.rcv_ch.idx",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Receive Channel Index", HFILL}
+ },
+ {&hf_docsis_rcc_rcv_ch_conn,
+ {"..2 Receive Channel Connectivity", "docsis_tlv.rcc.rcv_ch.conn",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Receive Channel Connectivity", HFILL}
+ },
+ {&hf_docsis_rcc_rcv_ch_ctr_freq_asgn,
+ {"..4 Receive Channel Center Frequency Assignment", "docsis_tlv.rcc.rcv_ch.ctr_freq_asgn",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Receive Channel Center Frequency Assignment", HFILL}
+ },
+ {&hf_docsis_rcc_rcv_ch_prim_ds_ch_ind,
+ {"..5 Primary Downstream Channel Indicator", "docsis_tlv.rcc.rcv_ch.prim_ds_ch_ind",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Primary Downstream Channel Indicator", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_rcc_part_serv_ds_ch,
+ {".6 Partial Service Downstream Channels", "docsis_tlv.rcc.part_serv_ds_ch",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Partial Service Downstream Channels", HFILL}
+ },
+ {&hf_docsis_tlv_rcc_ven_spec,
+ {".43 Vendor Specific Encodings", "docsis_tlv.rcc.vendorspec",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Vendor Specific Encodings", HFILL}
+ },
+ {&hf_docsis_tlv_rcc_err,
+ {".254 RCC Error Encodings", "docsis_tlv.rcc.err",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "RCC Error Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_rcc_partial_serv_down_chan_id,
+ {"Downstream Channel ID", "docsis_tlv.rcc.partial_serv_down_chan.ds_ch_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_rcc_srcc_prim_ds_chan_assign_ds_ch_id,
+ {"Downstream Channel ID", "docsis_tlv.rcc.srcc.prim_ds_chann_assign.ds_ch_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_rcc_srcc_ds_chan_assign_ds_ch_id,
+ {"Downstream Channel ID", "docsis_tlv.rcc.srcc.ds_chann_assign.ds_ch_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_rcc_srcc_ds_prof_assign_dcid,
+ {"....1 DCID", "docsis_tlv.rcc.srcc.ds_prof_assign.prof_list.dcid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_rcc_srcc_ds_prof_asssign_prof_list_prof_id,
+ {"Profile ID", "docsis_tlv.rcc.srcc.ds_prof_assign.prof_list.prof_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_rcc_prim_down_chan,
+ {".8 Primary Downstream Channel", "docsis_tlv.rcc.prim_down_chan",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_rcc_err_mod_or_ch,
+ {".1 Receive Modul or Receive Channel", "docsis_tlv.rcc.err.mod_or_ch",
+ FT_UINT8, BASE_DEC, VALS (mod_or_ch_vals), 0x0,
+ "Receive Modul or Receive Channel", HFILL}
+ },
+ {&hf_docsis_tlv_rcc_err_idx,
+ {".2 Receive Modul/Channel Index", "docsis_tlv.rcc.err.idx",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Receive Modul/Channel Index", HFILL}
+ },
+ {&hf_docsis_tlv_rcc_err_param,
+ {".3 Reported Parameter", "docsis_tlv.rcc.err.param",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Reported Parameter", HFILL}
+ },
+ {&hf_docsis_tlv_rcc_err_code,
+ {".4 Error Code", "docsis_tlv.rcc.err.code",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
+ "Error Code", HFILL}
+ },
+ {&hf_docsis_tlv_rcc_err_msg,
+ {".5 Error Message", "docsis_tlv.rcc.err.msg",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Error Message", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_dsid,
+ {"50 DSID Encodings", "docsis_tlv.dsid",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "DSID Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_dsid_id,
+ {".1 Downstream Service Identifier (DSID)", "docsis_tlv.dsid.id",
+ FT_UINT24, BASE_DEC, NULL, 0x0,
+ "Downstream Service Identifier (DSID)", HFILL}
+ },
+ {&hf_docsis_tlv_dsid_action,
+ {".2 DSID Action", "docsis_tlv.dsid.action",
+ FT_UINT8, BASE_DEC, VALS (dsid_action_vals), 0x0,
+ "DSID Action", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_dsid_ds_reseq,
+ {".3 Downstream Resequencing Encodings", "docsis_tlv.dsid.ds_reseq",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Downstream Resequencing Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_ds_reseq_dsid,
+ {"..1 Resequencing DSID", "docsis_tlv.dsid.ds_reseq.dsid",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Resequencing DSID", HFILL}
+ },
+ {&hf_docsis_ds_reseq_ch_lst,
+ {"..2 Downstream Resequencing Channel List", "docsis_tlv.dsid.ds_reseq.ch_lst",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Downstream Resequencing Channel List", HFILL}
+ },
+ {&hf_docsis_ds_reseq_wait_time,
+ {"..3 Downstream Resequencing Wait Time", "docsis_tlv.dsid.ds_reseq.wait_time",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Downstream Resequencing Wait Time", HFILL}
+ },
+ {&hf_docsis_ds_reseq_warn_thresh,
+ {"..4 Resequencing Warn Threshold", "docsis_tlv.dsid.ds_reseq.warn_thresh",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Resequencing Warn Threshold", HFILL}
+ },
+ {&hf_docsis_ds_reseq_ho_timer,
+ {"..5 CM-Status max. Event Hold-Off Timer (Out-of-Range Events)", "docsis_tlv.dsid.ds_reseq.ho_timer",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "CM-Status max. Event Hold-Off Timer (Out-of-Range Events)", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_dsid_mc,
+ {".4 Multicast Encodings", "docsis_tlv.dsid.mc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Multicast Encodings", HFILL}
+ },
+ {&hf_docsis_tlv_dsid_mc_addr,
+ {"..1 Client MAC Address Encodings", "docsis_tlv.dsid.mc.addr",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Client MAC Address Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_mc_addr_action,
+ {"...1 Client MAC Address Action", "docsis_tlv.dsid.mc.addr.action",
+ FT_UINT8, BASE_DEC, VALS (add_del_vals), 0x0,
+ "Client MAC Address Action", HFILL}
+ },
+ {&hf_docsis_mc_addr_addr,
+ {"...2 Client MAC Address", "docsis_tlv.dsid.mc.addr.addr",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Client MAC Address", HFILL}
+ },
+ {&hf_docsis_tlv_dsid_mc_cmim,
+ {"..2 Multicast CM Interface Mask", "docsis_tlv.dsid.mc.cmim",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Multicast CM Interface Mask", HFILL}
+ },
+ {&hf_docsis_tlv_dsid_mc_group,
+ {"..3 Multicast Group MAC Addresses", "docsis_tlv.dsid.mc.group",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Multicast Group MAC Addresses", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_dsid_mc_phs,
+ {"..26 Payload Header Suppression Encodings", "docsis_tlv.dsid.mc.phs",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Payload Header Suppression Encodings", HFILL}
+ },
+ {&hf_docsis_tlv_sec_assoc,
+ {"51 Security Association Encodings", "docsis_tlv.sec_assoc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Security Association Encodings", HFILL}
+ },
+#endif
+ {&hf_docsis_tlv_sec_assoc_action,
+ {".1 SA Action", "docsis_tlv.sec_assoc.action",
+ FT_UINT8, BASE_DEC, VALS (add_del_vals), 0x0,
+ "SA Action", HFILL}
+ },
+ {&hf_docsis_tlv_sec_assoc_desc,
+ {".23 SA Descriptor", "docsis_tlv.sec_assoc.desc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "SA Descriptor", HFILL}
+ },
+ {&hf_docsis_tlv_init_ch_timeout,
+ {"52 Initializing Channel Timeout", "docsis_tlv.init_ch_timeout",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Initializing Channel Timeout", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_ch_asgn,
+ {"56 Channel Assignment Configuration Settings", "docsis_tlv.ch_asgn",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Channel Assignment Configuration Settings", HFILL}
+ },
+#endif
+ {&hf_docsis_ch_asgn_us_ch_id,
+ {".1 Upstream Channel ID", "docsis_tlv.ch_asgn.us_ch_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Upstream Channel ID", HFILL}
+ },
+ {&hf_docsis_ch_asgn_rx_freq,
+ {".2 Rx Frequency", "docsis_tlv.ch_asgn.rx_freq",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Rx Frequency", HFILL}
+ },
+ {&hf_docsis_tlv_cm_init_reason,
+ {"57 CM Initialization Reason", "docsis_tlv.cm_init_reason",
+ FT_UINT16, BASE_DEC, VALS (init_reason_vals), 0x0,
+ "CM Initialization Reason", HFILL}
+ },
+ {&hf_docsis_tlv_sw_upg_srvr_ipv6,
+ {"58 Software Upgrade Server IPv6", "docsis_tlv.sw_upg_srvr_ipv6",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "Software Upgrade Server IPv6", HFILL}
+ },
+ {&hf_docsis_tlv_tftp_prov_cm_ipv6_addr,
+ {"59 TFTP Server Provisioned Modem IPv6 Address", "docsis_tlv.tftp_prov_cm_ipv6_addr",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "TFTP Server Provisioned Modem IPv6 Address", HFILL}
+ },
+ {&hf_docsis_tlv_us_drop_clfy,
+ {"60 Upstream Drop Packet Classification Encoding", "docsis_tlv.us_drop_clfy",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Upstream Drop Packet Classification Encoding", HFILL}
+ },
+ {&hf_docsis_tlv_subs_mgmt_ipv6_lst,
+ {"61 Subscriber Management CPE IPv6 Prefix List", "docsis_tlv.subs_mgmt_ipv6_lst",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Subscriber Management CPE IPv6 Prefix List", HFILL}
+ },
+ {&hf_docsis_tlv_us_drop_clfy_group_id,
+ {"62 Upstream Drop Classifier Group ID", "docsis_tlv.us_drop_clfy_group_id",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Upstream Drop Classifier Group ID", HFILL}
+ },
+ {&hf_docsis_tlv_subs_mgmt_ctrl_max_cpe_ipv6,
+ {"63 Subscriber Management Control Max CPE IPv6 Prefix", "docsis_tlv.subs_mgmt_ctrl_max_cpe_ipv6",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Subscriber Management Control Max CPE IPv6 Prefix", HFILL}
+ },
+#if 0
+ {&hf_docsis_tlv_cmts_mc_sess_enc,
+ {"64 CMTS Static Multicast Session Encoding", "docsis_tlv.cmts_mc_sess_enc",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "CMTS Static Multicast Session Encoding", HFILL}
+ },
+#endif
+ {&hf_docsis_cmts_mc_sess_enc_grp,
+ {".1 Multicast Group Address", "docsis_tlv.cmts_mc_sess_enc.grp",
+ FT_IPXNET, BASE_NONE, NULL, 0x0,
+ "Multicast Group Address", HFILL}
+ },
+ {&hf_docsis_cmts_mc_sess_enc_src,
+ {".2 Source IP Address", "docsis_tlv.cmts_mc_sess_enc.src",
+ FT_IPXNET, BASE_NONE, NULL, 0x0,
+ "Source IP Address", HFILL}
+ },
+ {&hf_docsis_cmts_mc_sess_enc_cmim,
+ {".3 CMIM", "docsis_tlv.cmts_mc_sess_enc.cmim",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "CMIM", HFILL}
+ },
+ {&hf_docsis_tlv_em_mode_ind,
+ {"75 Energy Management Mode Indicator", "docsis_tlv.em_mode_ind",
+ FT_UINT8, BASE_DEC, VALS(em_mode_ind_vals), 0x0,
+ "Energy Management Mode Indicator", HFILL}
+ },
+ {&hf_docsis_tlv_em_id_list_for_cm_em_id,
+ {"Energy Management Identifier", "docsis_tlv.em_id_list_for_cm.em_id",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_fdx_tg_assignment_tg_id,
+ {"Transmission Group ID", "docsis_tlv.fdx_tg_assignment_tg_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_fdx_tg_assignment_rba_type,
+ {"RBA Type", "docsis_tlv.fdx_tg_assignment_rba_type",
+ FT_UINT8, BASE_DEC, VALS (rba_type_vals), 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_fdx_reset,
+ {"86 FDX Reset", "docsis_tlv.fdx_reset",
+ FT_UINT8, BASE_DEC, VALS (fdx_reset_vals), 0x0,
+ "FDX Reset", HFILL}
+ },
+ {&hf_docsis_tlv_unknown,
+ {"Unknown TLV", "docsis_tlv.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_unknown_type,
+ {"Type", "docsis_tlv.unknown.type",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_unknown_length,
+ {"Length", "docsis_tlv.unknown.length",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ {&hf_docsis_tlv_unknown_value,
+ {"Value", "docsis_tlv.unknown.value",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+ { &hf_docsis_ucd_fragment_overlap,
+ { "Fragment overlap", "docsis_tlv.ucd.fragment.overlap",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Fragment overlaps with other fragments", HFILL}
+ },
+ { &hf_docsis_ucd_fragment_overlap_conflict,
+ { "Conflicting data in fragment overlap", "docsis_tlv.ucd.fragment.overlap.conflict",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Overlapping fragments contained conflicting data", HFILL}
+ },
+ { &hf_docsis_ucd_fragment_multiple_tails,
+ { "Multiple tail fragments found", "docsis_tlv.ucd.fragment.multipletails",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Several tails were found when defragmenting the packet", HFILL}
+ },
+ { &hf_docsis_ucd_fragment_too_long_fragment,
+ { "Fragment too long", "docsis_tlv.ucd.fragment.toolongfragment",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Fragment contained data past end of packet", HFILL}
+ },
+ { &hf_docsis_ucd_fragment_error,
+ { "Defragmentation error", "docsis_tlv.ucd.fragment.error",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ "Defragmentation error due to illegal fragments", HFILL}
+ },
+ { &hf_docsis_ucd_fragment_count,
+ { "Fragment count", "docsis_tlv.ucd.fragment.count",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ { &hf_docsis_ucd_fragment,
+ { "UCD Fragment", "docsis_tlv.ucd.fragment",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+ { &hf_docsis_ucd_fragments,
+ { "UCD Fragments", "docsis_tlv.ucd.fragments",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+ { &hf_docsis_ucd_reassembled_in,
+ { "Reassembled UCD in frame", "docsis_tlv.ucd.reassembled_in",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ "This UCD packet is reassembled in this frame", HFILL}
+ },
+ { &hf_docsis_ucd_reassembled_length,
+ { "Reassembled UCD length", "docsis_tlv.ucd.reassembled.length",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "The total length of the reassembled payload", HFILL}
+ },
+ { &hf_docsis_ucd_reassembled_data,
+ { "Reassembled UCD data", "docsis_tlv.ucd.reassembled.data",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "The reassembled payload", HFILL}
+ },
+ { &hf_docsis_ucd_reassembled,
+ { ".5 Reassembled UCD", "docsis_tlv.ucd.reassembled",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "The reassembled UCD", HFILL}
+ },
+
+ };
+
+ static gint *ett[] = {
+ &ett_docsis_tlv,
+ &ett_docsis_tlv_cos,
+ &ett_docsis_tlv_mcap,
+ &ett_docsis_tlv_mcap_em,
+ &ett_docsis_tlv_mcap_em_pref,
+ &ett_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup,
+ &ett_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup,
+ &ett_docsis_tlv_mcap_down_lower_band_edge_conf,
+ &ett_docsis_tlv_mcap_down_upper_band_edge_conf,
+ &ett_docsis_tlv_mcap_dipl_down_lower_band_edge,
+ &ett_docsis_tlv_mcap_dipl_down_upper_band_edge,
+ &ett_docsis_tlv_mcap_dipl_up_upper_band_edge,
+ &ett_docsis_tlv_mcap_advanced_band_plan,
+ &ett_docsis_tlv_mcap_dipl_down_lower_band_edge_options_list,
+ &ett_docsis_tlv_mcap_dipl_down_upper_band_edge_options_list,
+ &ett_docsis_tlv_mcap_dipl_up_upper_band_edge_options_list,
+ &ett_docsis_tlv_clsfr,
+ &ett_docsis_tlv_clsfr_ip,
+ &ett_docsis_tlv_clsfr_ip6,
+ &ett_docsis_tlv_clsfr_ip6_tc,
+ &ett_docsis_tlv_clsfr_eth,
+ &ett_docsis_tlv_clsfr_err,
+ &ett_docsis_tlv_clsfr_dot1q,
+ &ett_docsis_tlv_reqxmitpol,
+ &ett_docsis_tlv_sflow_err,
+ &ett_docsis_tlv_phs,
+ &ett_docsis_tlv_phs_err,
+ &ett_docsis_tlv_svc_unavail,
+ &ett_docsis_tlv_snmpv3_kick,
+ &ett_docsis_tlv_ds_ch_list,
+ &ett_docsis_tlv_ds_ch_list_single,
+ &ett_docsis_tlv_ds_ch_list_range,
+ &ett_docsis_tlv_ext_field,
+ &ett_docsis_tlv_vendor_specific_cap,
+ &ett_docsis_tlv_dut_filter,
+ &ett_docsis_tlv_tcc,
+ &ett_docsis_tlv_tcc_ucd,
+ &ett_docsis_tlv_tcc_rng_parms,
+ &ett_docsis_tlv_tcc_oudp,
+ &ett_docsis_tlv_tcc_err,
+ &ett_docsis_tlv_sid_cl,
+ &ett_docsis_tlv_sid_cl_enc,
+ &ett_docsis_tlv_sid_cl_enc_map,
+ &ett_docsis_tlv_sid_cl_so,
+ &ett_docsis_tlv_rcp,
+ &ett_docsis_tlv_rcp_rcv_mod_enc,
+ &ett_docsis_tlv_rcp_ch_bl_rng,
+ &ett_docsis_tlv_rcp_rcv_ch,
+ &ett_docsis_tlv_rcc,
+ &ett_docsis_tlv_rcc_rcv_mod_enc,
+ &ett_docsis_tlv_rcc_rcv_ch,
+ &ett_docsis_tlv_rcc_partial_serv_down_chan,
+ &ett_docsis_tlv_rcc_srcc,
+ &ett_docsis_tlv_rcc_srcc_prim_ds_assign,
+ &ett_docsis_tlv_rcc_srcc_ds_assign,
+ &ett_docsis_tlv_rcc_srcc_ds_prof_assign,
+ &ett_docsis_tlv_rcc_srcc_ds_prof_assign_prof_list,
+ &ett_docsis_tlv_rcc_err,
+ &ett_docsis_tlv_dsid,
+ &ett_docsis_tlv_dsid_ds_reseq,
+ &ett_docsis_tlv_dsid_mc,
+ &ett_docsis_tlv_dsid_mc_addr,
+ &ett_docsis_tlv_sec_assoc,
+ &ett_docsis_tlv_ch_asgn,
+ &ett_docsis_cmts_mc_sess_enc,
+ &ett_docsis_em_id_list_for_cm,
+ &ett_docsis_tlv_tg_assignment,
+ &ett_docsis_tlv_unknown,
+ &ett_docsis_ucd_fragment,
+ &ett_docsis_ucd_fragments,
+ &ett_docsis_ucd_reassembled,
+ };
+
+ static ei_register_info ei[] = {
+ {&ei_docsis_tlv_tlvlen_bad, { "docsis_tlv.tlvlenbad", PI_MALFORMED, PI_ERROR, "Bad TLV length", EXPFILL}},
+ {&ei_docsis_tlv_tlvval_bad, { "docsis_tlv.tlvvalbad", PI_PROTOCOL, PI_WARN, "Wrong TLV value", EXPFILL}},
+ };
+
+ expert_module_t* expert_docsis_tlv;
+
+ proto_docsis_tlv = proto_register_protocol ("DOCSIS Appendix C TLVs", "DOCSIS TLVs", "docsis_tlv");
+
+ proto_register_field_array (proto_docsis_tlv, hf, array_length (hf));
+ proto_register_subtree_array (ett, array_length (ett));
+ expert_docsis_tlv = expert_register_protocol(proto_docsis_tlv);
+ expert_register_field_array(expert_docsis_tlv, ei, array_length(ei));
+
+ register_dissector ("docsis_tlv", dissect_docsis_tlv, proto_docsis_tlv);
+}
+
+void
+proto_reg_handoff_docsis_tlv (void)
+{
+#if 0
+ dissector_handle_t docsis_tlv_handle;
+
+ docsis_tlv_handle = find_dissector ("docsis_tlv");
+ dissector_add_uint ("docsis", 0xFF, docsis_tlv_handle);
+#endif
+
+ docsis_vsif_handle = find_dissector("docsis_vsif");
+ docsis_ucd_handle = find_dissector("docsis_ucd");
+ docsis_rba_handle = find_dissector("docsis_rba");
+
+ reassembly_table_register(&ucd_reassembly_table,
+ &addresses_reassembly_table_functions);
+
+
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local Variables:
+ * c-basic-offset: 2
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=2 tabstop=8 expandtab:
+ * :indentSize=2:tabSize=8:noTabs=true:
+ */