Coverage Report

Created: 2026-07-12 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-docsis-tlv.c
Line
Count
Source
1
/* packet-docsis-tlv.c
2
 *
3
 * Routines to Dissect Appendix C TLVs
4
 * Copyright 2015, Adrian Simionov <daniel.simionov@gmail.com>
5
 * Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
6
 * Copyright 2017, Bruno Verstuyft <bruno.verstuyft@excentis.com>
7
 *
8
 * Wireshark - Network traffic analyzer
9
 * By Gerald Combs <gerald@wireshark.org>
10
 * Copyright 1998 Gerald Combs
11
 *
12
 * SPDX-License-Identifier: GPL-2.0-or-later
13
 */
14
15
#include "config.h"
16
17
#include <epan/packet.h>
18
#include <epan/expert.h>
19
#include <epan/reassemble.h>
20
#include <epan/tfs.h>
21
#include <epan/unit_strings.h>
22
23
#include "packet-docsis-tlv.h"
24
25
/* This module will dissect the Appendix C TLVs.  Please see:
26
 * http://www.cablemodem.com/specifications/specifications.html
27
 *
28
 * The main dissector is dissect_docsis_tlv.  This routine will dissect
29
 * top level TLVs and call sub-dissectors for the sub-TLVs.
30
 */
31
32
void proto_register_docsis_tlv(void);
33
void proto_reg_handoff_docsis_tlv(void);
34
35
/* Initialize the protocol and registered fields */
36
static dissector_handle_t docsis_vsif_handle;
37
static dissector_handle_t docsis_ucd_handle;
38
static dissector_handle_t docsis_rba_handle;
39
40
static int proto_docsis_tlv;
41
static int hf_docsis_tlv_down_freq;
42
static int hf_docsis_tlv_upstream_chid;
43
static int hf_docsis_tlv_net_access;
44
/* static int hf_docsis_tlv_cos; */
45
/* static int hf_docsis_tlv_mcap; */
46
static int hf_docsis_tlv_privacy_enable;
47
static int hf_docsis_tlv_max_cpe;
48
static int hf_docsis_tlv_max_classifiers;
49
static int hf_docsis_tlv_snmp_access;
50
static int hf_docsis_tlv_snmp_obj;
51
static int hf_docsis_tlv_svc_unavail;
52
static int hf_docsis_tlv_svc_unavail_classid;
53
static int hf_docsis_tlv_svc_unavail_type;
54
static int hf_docsis_tlv_svc_unavail_code;
55
static int hf_docsis_tlv_bpi;
56
/* static int hf_docsis_tlv_phs; */
57
static int hf_docsis_tlv_hmac_digest;
58
static int hf_docsis_tlv_tftp_server_timestamp;
59
static int hf_docsis_tlv_tftp_prov_modem_address;
60
/* static int hf_docsis_tlv_upclsfr; */
61
/* static int hf_docsis_tlv_downclsfr; */
62
/* static int hf_docsis_tlv_upsflow; */
63
/* static int hf_docsis_tlv_downsflow; */
64
/* static int hf_docsis_tlv_vendor_spec; */
65
static int hf_docsis_tlv_cm_mic;
66
static int hf_docsis_tlv_cmts_mic;
67
static int hf_docsis_tlv_auth_block;
68
static int hf_docsis_tlv_key_seq_num;
69
static int hf_docsis_tlv_snmpv3_kick;
70
static int hf_docsis_tlv_snmpv3_kick_name;
71
static int hf_docsis_tlv_snmpv3_kick_publicnum;
72
static int hf_docsis_tlv_mfgr_cvc;
73
static int hf_docsis_tlv_cosign_cvc;
74
static int hf_docsis_tlv_vendor_id;
75
static int hf_docsis_tlv_sw_file;
76
static int hf_docsis_tlv_sw_upg_srvr;
77
static int hf_docsis_tlv_cpe_ethernet;
78
static int hf_docsis_tlv_modem_addr;
79
static int hf_docsis_tlv_rng_tech;
80
static int hf_docsis_tlv_subs_mgmt_ctrl;
81
static int hf_docsis_tlv_subs_mgmt_ip_table;
82
static int hf_docsis_tlv_subs_mgmt_ip_entry;
83
static int hf_docsis_tlv_subs_mgmt_filter_grps;
84
static int hf_docsis_tlv_snmpv3_ntfy_rcvr;
85
static int hf_docsis_tlv_enable_20_mode;
86
static int hf_docsis_tlv_enable_test_modes;
87
/* static int hf_docsis_tlv_ds_ch_list; */
88
static int hf_docsis_tlv_mc_mac_address;
89
/* static int hf_docsis_tlv_dut_filter; */
90
/* static int hf_docsis_tlv_tcc; */
91
/* static int hf_docsis_tlv_sid_cl; */
92
/* static int hf_docsis_tlv_rcp; */
93
/* static int hf_docsis_tlv_rcc; */
94
/* static int hf_docsis_tlv_dsid; */
95
/* static int hf_docsis_tlv_sec_assoc; */
96
static int hf_docsis_tlv_init_ch_timeout;
97
/* static int hf_docsis_tlv_ch_asgn; */
98
static int hf_docsis_tlv_cm_init_reason;
99
static int hf_docsis_tlv_sw_upg_srvr_ipv6;
100
static int hf_docsis_tlv_tftp_prov_cm_ipv6_addr;
101
static int hf_docsis_tlv_us_drop_clfy;
102
static int hf_docsis_tlv_subs_mgmt_ipv6_lst;
103
static int hf_docsis_tlv_us_drop_clfy_group_id;
104
static int hf_docsis_tlv_subs_mgmt_ctrl_max_cpe_ipv6;
105
/* static int hf_docsis_tlv_cmts_mc_sess_enc; */
106
107
static int hf_docsis_tlv_cos_id;
108
static int hf_docsis_tlv_cos_sid;
109
static int hf_docsis_tlv_cos_max_down;
110
static int hf_docsis_tlv_cos_max_up;
111
static int hf_docsis_tlv_cos_up_chnl_pri;
112
static int hf_docsis_tlv_cos_min_grntd_up;
113
static int hf_docsis_tlv_cos_max_up_burst;
114
static int hf_docsis_tlv_cos_privacy_enable;
115
116
static int hf_docsis_tlv_mcap_concat;
117
static int hf_docsis_tlv_mcap_docs_ver;
118
static int hf_docsis_tlv_mcap_frag;
119
static int hf_docsis_tlv_mcap_phs;
120
static int hf_docsis_tlv_mcap_igmp;
121
static int hf_docsis_tlv_mcap_down_said;
122
static int hf_docsis_tlv_mcap_up_sid;
123
static int hf_docsis_tlv_mcap_privacy;
124
static int hf_docsis_tlv_mcap_8021P_filter;
125
static int hf_docsis_tlv_mcap_8021Q_filter;
126
static int hf_docsis_tlv_mcap_xmit_eq_taps_per_sym;
127
static int hf_docsis_tlv_mcap_xmit_eq_taps;
128
static int hf_docsis_tlv_mcap_dcc;
129
static int hf_docsis_tlv_mcap_ip_filters;
130
static int hf_docsis_tlv_mcap_llc_filters;
131
static int hf_docsis_tlv_mcap_exp_unicast_sid;
132
static int hf_docsis_tlv_mcap_rnghoff_cm;
133
static int hf_docsis_tlv_mcap_rnghoff_erouter;
134
static int hf_docsis_tlv_mcap_rnghoff_emta;
135
static int hf_docsis_tlv_mcap_rnghoff_estb;
136
static int hf_docsis_tlv_mcap_l2vpn;
137
static int hf_docsis_tlv_mcap_l2vpn_esafe;
138
static int hf_docsis_tlv_mcap_dut_filtering;
139
static int hf_docsis_tlv_mcap_us_freq_range;
140
static int hf_docsis_tlv_mcap_us_srate_160;
141
static int hf_docsis_tlv_mcap_us_srate_320;
142
static int hf_docsis_tlv_mcap_us_srate_640;
143
static int hf_docsis_tlv_mcap_us_srate_1280;
144
static int hf_docsis_tlv_mcap_us_srate_2560;
145
static int hf_docsis_tlv_mcap_us_srate_5120;
146
static int hf_docsis_tlv_mcap_sac;
147
static int hf_docsis_tlv_mcap_code_hop_mode2;
148
static int hf_docsis_tlv_mcap_mtc;
149
static int hf_docsis_tlv_mcap_512_msps_utc;
150
static int hf_docsis_tlv_mcap_256_msps_utc;
151
static int hf_docsis_tlv_mcap_total_sid_cluster;
152
static int hf_docsis_tlv_mcap_sid_per_sf;
153
static int hf_docsis_tlv_mcap_mrc;
154
static int hf_docsis_tlv_mcap_total_dsid;
155
static int hf_docsis_tlv_mcap_reseq_dsid;
156
static int hf_docsis_tlv_mcap_mc_dsid;
157
static int hf_docsis_tlv_mcap_mc_dsid_fwd;
158
static int hf_docsis_tlv_mcap_fctype_fwd;
159
static int hf_docsis_tlv_mcap_dpv_path;
160
static int hf_docsis_tlv_mcap_dpv_packet;
161
static int hf_docsis_tlv_mcap_ugs;
162
static int hf_docsis_tlv_mcap_map_ucd;
163
static int hf_docsis_tlv_mcap_udc;
164
static int hf_docsis_tlv_mcap_ipv6;
165
static int hf_docsis_tlv_mcap_ext_us_trans_power;
166
static int hf_docsis_tlv_mcap_em;
167
static int hf_docsis_tlv_mcap_em_1x1;
168
static int hf_docsis_tlv_mcap_em_light_sleep;
169
static int hf_docsis_tlv_mcap_cm_status_ack;
170
static int hf_docsis_tlv_mcap_em_pref;
171
static int hf_docsis_tlv_mcap_em_pref_1x1;
172
static int hf_docsis_tlv_mcap_em_pref_dls;
173
static int hf_docsis_tlv_mcap_ext_pkt_len_sup_cap;
174
static int hf_docsis_tlv_mcap_ofdm_mult_recv_chan_sup;
175
static int hf_docsis_tlv_mcap_ofdma_mult_trans_chan_sup;
176
static int hf_docsis_tlv_mcap_down_ofdm_prof_sup;
177
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup;
178
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_reserved;
179
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_qpsk;
180
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16qam;
181
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_64qam;
182
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_128qam;
183
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_256qam;
184
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_512qam;
185
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_1024qam;
186
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_2048qam;
187
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_4096qam;
188
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_8192qam;
189
static int hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16384qam;
190
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup;
191
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_reserved;
192
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_qpsk;
193
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8qam;
194
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16qam;
195
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_32qam;
196
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_64qam;
197
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_128qam;
198
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_256qam;
199
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_512qam;
200
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_1024qam;
201
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_2048qam;
202
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_4096qam;
203
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8192qam;
204
static int hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16384qam;
205
static int hf_docsis_tlv_mcap_down_lower_band_edge_conf;
206
static int hf_docsis_tlv_mcap_down_lower_band_edge_conf_108;
207
static int hf_docsis_tlv_mcap_down_lower_band_edge_conf_258;
208
static int hf_docsis_tlv_mcap_down_upper_band_edge_conf;
209
static int hf_docsis_tlv_mcap_down_upper_band_edge_conf_1218;
210
static int hf_docsis_tlv_mcap_down_upper_band_edge_conf_1794;
211
static int hf_docsis_tlv_mcap_down_upper_band_edge_conf_1002;
212
static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_conf;
213
static int hf_docsis_tlv_mcap_docsis_time_prot_mode;
214
static int hf_docsis_tlv_mcap_docsis_time_prot_perf_sup;
215
static int hf_docsis_tlv_mcap_pmax;
216
static int hf_docsis_tlv_mcap_dipl_down_lower_band_edge;
217
static int hf_docsis_tlv_mcap_dipl_down_lower_band_edge_108;
218
static int hf_docsis_tlv_mcap_dipl_down_lower_band_edge_258;
219
static int hf_docsis_tlv_mcap_dipl_down_upper_band_edge;
220
static int hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1218;
221
static int hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1794;
222
static int hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1002;
223
static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge;
224
static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_42;
225
static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_65;
226
static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_85;
227
static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_117;
228
static int hf_docsis_tlv_mcap_dipl_up_upper_band_edge_204;
229
static int hf_docsis_tlv_mcap_advanced_band_plan;
230
static int hf_docsis_tlv_mcap_advanced_band_plan_fdx_l;
231
static int hf_docsis_tlv_mcap_advanced_band_plan_fdx;
232
static int hf_docsis_tlv_mcap_advanced_band_plan_fdd;
233
static int hf_docsis_tlv_mcap_advanced_band_plan_reserved;
234
static int hf_docsis_tlv_mcap_ext_sf_cluster_assign_sup;
235
static int hf_docsis_tlv_mcap_low_latency_sup;
236
static int hf_docsis_tlv_mcap_adv_down_lower_band_edge_conf;
237
static int hf_docsis_tlv_mcap_adv_down_upper_band_edge_conf;
238
static int hf_docsis_tlv_mcap_adv_up_upper_band_edge_conf;
239
static int hf_docsis_tlv_mcap_adv_down_lower_band_edge_option;
240
static int hf_docsis_tlv_mcap_adv_down_upper_band_edge_option;
241
static int hf_docsis_tlv_mcap_adv_up_upper_band_edge_option;
242
static int hf_docsis_tlv_mcap_extended_power_options;
243
244
static int hf_docsis_tlv_clsfr_ref;
245
static int hf_docsis_tlv_clsfr_id;
246
static int hf_docsis_tlv_clsfr_sflow_ref;
247
static int hf_docsis_tlv_clsfr_sflow_id;
248
static int hf_docsis_tlv_clsfr_rule_pri;
249
static int hf_docsis_tlv_clsfr_act_state;
250
static int hf_docsis_tlv_clsfr_dsc_act;
251
/* static int hf_docsis_tlv_clsfr_err; */
252
/* static int hf_docsis_tlv_ipclsfr; */
253
/* static int hf_docsis_tlv_ethclsfr; */
254
/* static int hf_docsis_tlv_dot1qclsfr; */
255
256
static int hf_docsis_tlv_clsfr_vendor_spc;
257
258
static int hf_docsis_tlv_clsfr_err_param;
259
static int hf_docsis_tlv_clsfr_err_code;
260
static int hf_docsis_tlv_clsfr_err_msg;
261
262
static int hf_docsis_tlv_ipclsfr_tosmask;
263
static int hf_docsis_tlv_ipclsfr_ipproto;
264
static int hf_docsis_tlv_ipclsfr_src;
265
static int hf_docsis_tlv_ipclsfr_dst;
266
static int hf_docsis_tlv_ipclsfr_srcmask;
267
static int hf_docsis_tlv_ipclsfr_dstmask;
268
static int hf_docsis_tlv_ipclsfr_sport_start;
269
static int hf_docsis_tlv_ipclsfr_sport_end;
270
static int hf_docsis_tlv_ipclsfr_dport_start;
271
static int hf_docsis_tlv_ipclsfr_dport_end;
272
273
static int hf_docsis_tlv_ip6clsfr_tc_low;
274
static int hf_docsis_tlv_ip6clsfr_tc_high;
275
static int hf_docsis_tlv_ip6clsfr_tc_mask;
276
static int hf_docsis_tlv_ip6clsfr_flow_label;
277
static int hf_docsis_tlv_ip6clsfr_next_header;
278
static int hf_docsis_tlv_ip6clsfr_src;
279
static int hf_docsis_tlv_ip6clsfr_src_prefix_length;
280
static int hf_docsis_tlv_ip6clsfr_dst;
281
static int hf_docsis_tlv_ip6clsfr_dst_prefix_length;
282
283
static int hf_docsis_tlv_ethclsfr_dmac;
284
static int hf_docsis_tlv_ethclsfr_smac;
285
static int hf_docsis_tlv_ethclsfr_ethertype;
286
287
static int hf_docsis_tlv_dot1qclsfr_user_pri;
288
static int hf_docsis_tlv_dot1qclsfr_vlanid;
289
static int hf_docsis_tlv_dot1qclsfr_vendorspec;
290
291
static int hf_docsis_tlv_sflow_ref;
292
static int hf_docsis_tlv_sflow_id;
293
static int hf_docsis_tlv_sflow_sid;
294
static int hf_docsis_tlv_sflow_classname;
295
static int hf_docsis_tlv_sflow_qos_param;
296
/* static int hf_docsis_tlv_sflow_err; */
297
static int hf_docsis_tlv_sflow_traf_pri;
298
static int hf_docsis_tlv_sflow_max_sus;
299
static int hf_docsis_tlv_sflow_max_burst;
300
static int hf_docsis_tlv_sflow_min_traf;
301
static int hf_docsis_tlv_sflow_ass_min_pkt_size;
302
static int hf_docsis_tlv_sflow_timeout_active;
303
static int hf_docsis_tlv_sflow_timeout_admitted;
304
static int hf_docsis_tlv_sflow_peak_traffic_rate;
305
static int hf_docsis_tlv_sflow_req_attr_mask;
306
static int hf_docsis_tlv_sflow_forb_attr_mask;
307
static int hf_docsis_tlv_sflow_attr_aggr_rule_mask;
308
static int hf_docsis_tlv_sflow_vendor_spec;
309
static int hf_docsis_tlv_sflow_max_concat_burst;
310
static int hf_docsis_tlv_sflow_sched_type;
311
static int hf_docsis_tlv_sflow_reqxmit_pol;
312
static int hf_docsis_tlv_sflow_reqxmit_all_cm_broadcast;
313
static int hf_docsis_tlv_sflow_reqxmit_priority_multicast;
314
static int hf_docsis_tlv_sflow_reqxmit_req_data_requests;
315
static int hf_docsis_tlv_sflow_reqxmit_req_data_data;
316
static int hf_docsis_tlv_sflow_reqxmit_piggy_back;
317
static int hf_docsis_tlv_sflow_reqxmit_concatenate_data;
318
static int hf_docsis_tlv_sflow_reqxmit_fragment;
319
static int hf_docsis_tlv_sflow_reqxmit_suppress_payload;
320
static int hf_docsis_tlv_sflow_reqxmit_drop_packets;
321
static int hf_docsis_tlv_sflow_nominal_polling;
322
static int hf_docsis_tlv_sflow_tolerated_jitter;
323
static int hf_docsis_tlv_sflow_ugs_size;
324
static int hf_docsis_tlv_sflow_nom_grant_intvl;
325
static int hf_docsis_tlv_sflow_tol_grant_jitter;
326
static int hf_docsis_tlv_sflow_grants_per_intvl;
327
static int hf_docsis_tlv_sflow_ip_tos_overwrite;
328
static int hf_docsis_tlv_sflow_ugs_timeref;
329
static int hf_docsis_tlv_sflow_cont_req_backoff_window_mult;
330
static int hf_docsis_tlv_sflow_num_of_bytes_requested_mult;
331
static int hf_docsis_tlv_sflow_max_down_latency;
332
static int hf_docsis_tlv_sflow_down_reseq;
333
334
static int hf_docsis_tlv_sflow_err_param;
335
static int hf_docsis_tlv_sflow_err_code;
336
static int hf_docsis_tlv_sflow_err_msg;
337
338
static int hf_docsis_tlv_phs_class_ref;
339
static int hf_docsis_tlv_phs_class_id;
340
static int hf_docsis_tlv_phs_sflow_ref;
341
static int hf_docsis_tlv_phs_sflow_id;
342
static int hf_docsis_tlv_phs_dsc_action;
343
/* static int hf_docsis_tlv_phs_err; */
344
static int hf_docsis_tlv_phs_phsf;
345
static int hf_docsis_tlv_phs_phsm;
346
/* static int hf_docsis_tlv_phs_phsv; */
347
static int hf_docsis_tlv_phs_phsi;
348
static int hf_docsis_tlv_phs_phss;
349
static int hf_docsis_tlv_phs_dbc_action;
350
static int hf_docsis_tlv_phs_vendorspec;
351
352
static int hf_docsis_tlv_phs_err_param;
353
static int hf_docsis_tlv_phs_err_code;
354
static int hf_docsis_tlv_phs_err_msg;
355
356
/* static int hf_docsis_tlv_ds_ch_list_single; */
357
/* static int hf_docsis_tlv_ds_ch_list_range; */
358
static int hf_docsis_tlv_ds_ch_list_default_timeout;
359
360
static int hf_docsis_tlv_single_ch_timeout;
361
static int hf_docsis_tlv_single_ch_freq;
362
363
static int hf_docsis_tlv_freq_rng_timeout;
364
static int hf_docsis_tlv_freq_rng_start;
365
static int hf_docsis_tlv_freq_rng_end;
366
static int hf_docsis_tlv_freq_rng_step;
367
368
static int hf_docsis_tlv_dut_filter_control;
369
static int hf_docsis_tlv_dut_filter_cmim;
370
371
static int hf_docsis_tlv_tcc_refid;
372
static int hf_docsis_tlv_tcc_us_ch_action;
373
static int hf_docsis_tlv_tcc_us_ch_id;
374
static int hf_docsis_tlv_tcc_new_us_ch_id;
375
static int hf_docsis_tlv_tcc_ucd;
376
static int hf_docsis_tlv_tcc_rng_sid;
377
static int hf_docsis_tlv_tcc_init_tech;
378
/* static int hf_docsis_tlv_tcc_rng_parms; */
379
static int hf_docsis_tlv_tcc_dyn_rng_win;
380
static int hf_docsis_tlv_tcc_p_16hi;
381
static int hf_docsis_tlv_tcc_oudp_iuc;
382
static int hf_docsis_tlv_tcc_extended_drw;
383
static int hf_docsis_tlv_tcc_extended_us_rng_pwr;
384
static int hf_docsis_tlv_tcc_oudp_sounding_sid;
385
/* static int hf_docsis_tlv_tcc_err; */
386
387
static int hf_docsis_rng_parms_us_ch_id;
388
static int hf_docsis_rng_parms_time_off_int;
389
static int hf_docsis_rng_parms_time_off_frac;
390
static int hf_docsis_rng_parms_power_off;
391
static int hf_docsis_rng_parms_freq_off;
392
393
static int hf_docsis_tcc_err_subtype;
394
static int hf_docsis_tcc_err_code;
395
static int hf_docsis_tcc_err_msg;
396
397
static int hf_docsis_sid_cl_sf_id;
398
/* static int hf_docsis_sid_cl_enc; */
399
/* static int hf_docsis_sid_cl_so_crit; */
400
401
static int hf_docsis_sid_cl_enc_id;
402
/* static int hf_docsis_sid_cl_enc_map; */
403
404
static int hf_docsis_sid_cl_map_us_ch_id;
405
static int hf_docsis_sid_cl_map_sid;
406
static int hf_docsis_sid_cl_map_action;
407
408
static int hf_docsis_sid_cl_so_max_req;
409
static int hf_docsis_sid_cl_so_max_out_bytes;
410
static int hf_docsis_sid_cl_so_max_req_bytes;
411
static int hf_docsis_sid_cl_so_max_time;
412
413
static int hf_docsis_tlv_rcp_id;
414
static int hf_docsis_tlv_rcp_name;
415
static int hf_docsis_tlv_rcp_freq_spc;
416
/* static int hf_docsis_tlv_rcp_rcv_mod_enc; */
417
/* static int hf_docsis_tlv_rcp_rcv_ch; */
418
/* static int hf_docsis_tlv_rcp_ven_spec; */
419
420
static int hf_docsis_rcv_mod_enc_idx;
421
static int hf_docsis_rcv_mod_enc_adj_ch;
422
/* static int hf_docsis_rcv_mod_enc_ch_bl_rng; */
423
static int hf_docsis_rcv_mod_enc_ctr_freq_asgn;
424
static int hf_docsis_rcv_mod_enc_rsq_ch_subs_cap;
425
static int hf_docsis_rcv_mod_enc_conn;
426
static int hf_docsis_rcv_mod_enc_phy_layr_parms;
427
428
static int hf_docsis_rcc_rcv_mod_enc_idx;
429
static int hf_docsis_rcc_rcv_mod_enc_ctr_freq_asgn;
430
static int hf_docsis_rcc_rcv_mod_enc_conn;
431
432
static int hf_docsis_ch_bl_rng_min_ctr_freq;
433
static int hf_docsis_ch_bl_rng_max_ctr_freq;
434
435
static int hf_docsis_rcv_ch_idx;
436
static int hf_docsis_rcv_ch_conn;
437
static int hf_docsis_rcv_ch_conn_off;
438
static int hf_docsis_rcv_ch_prim_ds_ch_ind;
439
440
static int hf_docsis_rcc_rcv_ch_idx;
441
static int hf_docsis_rcc_rcv_ch_conn;
442
static int hf_docsis_rcc_rcv_ch_ctr_freq_asgn;
443
static int hf_docsis_rcc_rcv_ch_prim_ds_ch_ind;
444
445
static int hf_docsis_tlv_rcc_id;
446
static int hf_docsis_tlv_rcc_partial_serv_down_chan_id;
447
static int hf_docsis_tlv_rcc_srcc_prim_ds_chan_assign_ds_ch_id;
448
static int hf_docsis_tlv_rcc_srcc_ds_chan_assign_ds_ch_id;
449
static int hf_docsis_tlv_rcc_srcc_ds_prof_assign_dcid;
450
static int hf_docsis_tlv_rcc_srcc_ds_prof_asssign_prof_list_prof_id;
451
static int hf_docsis_tlv_rcc_prim_down_chan;
452
/* static int hf_docsis_tlv_rcc_rcv_mod_enc; */
453
/* static int hf_docsis_tlv_rcc_rcv_ch; */
454
/* static int hf_docsis_tlv_rcc_part_serv_ds_ch; */
455
/* static int hf_docsis_tlv_rcc_ven_spec; */
456
/* static int hf_docsis_tlv_rcc_err; */
457
458
static int hf_docsis_tlv_rcc_err_mod_or_ch;
459
static int hf_docsis_tlv_rcc_err_idx;
460
static int hf_docsis_tlv_rcc_err_param;
461
static int hf_docsis_tlv_rcc_err_code;
462
static int hf_docsis_tlv_rcc_err_msg;
463
464
static int hf_docsis_tlv_dsid_id;
465
static int hf_docsis_tlv_dsid_action;
466
/* static int hf_docsis_tlv_dsid_ds_reseq; */
467
/* static int hf_docsis_tlv_dsid_mc; */
468
469
static int hf_docsis_ds_reseq_dsid;
470
static int hf_docsis_ds_reseq_ch_lst;
471
static int hf_docsis_ds_reseq_wait_time;
472
static int hf_docsis_ds_reseq_warn_thresh;
473
static int hf_docsis_ds_reseq_ho_timer;
474
475
/* static int hf_docsis_tlv_dsid_mc_addr; */
476
static int hf_docsis_tlv_dsid_mc_cmim;
477
static int hf_docsis_tlv_dsid_mc_group;
478
/* static int hf_docsis_tlv_dsid_mc_phs; */
479
480
static int hf_docsis_mc_addr_action;
481
static int hf_docsis_mc_addr_addr;
482
483
static int hf_docsis_tlv_sec_assoc_action;
484
static int hf_docsis_tlv_sec_assoc_desc;
485
486
static int hf_docsis_ch_asgn_us_ch_id;
487
static int hf_docsis_ch_asgn_rx_freq;
488
489
static int hf_docsis_cmts_mc_sess_enc_grp;
490
static int hf_docsis_cmts_mc_sess_enc_src;
491
static int hf_docsis_cmts_mc_sess_enc_cmim;
492
493
static int hf_docsis_tlv_em_mode_ind;
494
495
static int hf_docsis_tlv_em_id_list_for_cm_em_id;
496
497
static int hf_docsis_tlv_fdx_reset;
498
499
static int hf_docsis_tlv_fdx_tg_assignment_tg_id;
500
static int hf_docsis_tlv_fdx_tg_assignment_rba_type;
501
502
static int hf_docsis_tlv_unknown;
503
static int hf_docsis_tlv_unknown_type;
504
static int hf_docsis_tlv_unknown_length;
505
static int hf_docsis_tlv_unknown_value;
506
507
508
static int hf_docsis_ucd_fragments;
509
static int hf_docsis_ucd_fragment;
510
static int hf_docsis_ucd_fragment_overlap;
511
static int hf_docsis_ucd_fragment_overlap_conflict;
512
static int hf_docsis_ucd_fragment_multiple_tails;
513
static int hf_docsis_ucd_fragment_too_long_fragment;
514
static int hf_docsis_ucd_fragment_error;
515
static int hf_docsis_ucd_fragment_count;
516
static int hf_docsis_ucd_reassembled_in;
517
static int hf_docsis_ucd_reassembled_length;
518
static int hf_docsis_ucd_reassembled_data;
519
520
static int hf_docsis_ucd_reassembled;
521
522
523
/* Initialize the subtree pointers */
524
static int ett_docsis_tlv;
525
static int ett_docsis_tlv_cos;
526
static int ett_docsis_tlv_mcap;
527
static int ett_docsis_tlv_mcap_em;
528
static int ett_docsis_tlv_mcap_em_pref;
529
static int ett_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup;
530
static int ett_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup;
531
static int ett_docsis_tlv_mcap_down_lower_band_edge_conf;
532
static int ett_docsis_tlv_mcap_down_upper_band_edge_conf;
533
static int ett_docsis_tlv_mcap_dipl_down_lower_band_edge;
534
static int ett_docsis_tlv_mcap_dipl_down_upper_band_edge;
535
static int ett_docsis_tlv_mcap_dipl_up_upper_band_edge;
536
static int ett_docsis_tlv_mcap_advanced_band_plan;
537
static int ett_docsis_tlv_mcap_dipl_down_lower_band_edge_options_list;
538
static int ett_docsis_tlv_mcap_dipl_down_upper_band_edge_options_list;
539
static int ett_docsis_tlv_mcap_dipl_up_upper_band_edge_options_list;
540
static int ett_docsis_tlv_clsfr;
541
static int ett_docsis_tlv_clsfr_ip;
542
static int ett_docsis_tlv_clsfr_ip6;
543
static int ett_docsis_tlv_clsfr_ip6_tc;
544
static int ett_docsis_tlv_clsfr_eth;
545
static int ett_docsis_tlv_clsfr_err;
546
static int ett_docsis_tlv_phs;
547
static int ett_docsis_tlv_phs_err;
548
static int ett_docsis_tlv_clsfr_dot1q;
549
static int ett_docsis_tlv_reqxmitpol;
550
static int ett_docsis_tlv_sflow_err;
551
static int ett_docsis_tlv_svc_unavail;
552
static int ett_docsis_tlv_snmpv3_kick;
553
static int ett_docsis_tlv_ds_ch_list;
554
static int ett_docsis_tlv_ds_ch_list_single;
555
static int ett_docsis_tlv_ds_ch_list_range;
556
static int ett_docsis_tlv_ext_field;
557
static int ett_docsis_tlv_vendor_specific_cap;
558
static int ett_docsis_tlv_dut_filter;
559
static int ett_docsis_tlv_tcc;
560
static int ett_docsis_tlv_tcc_ucd;
561
static int ett_docsis_tlv_tcc_rng_parms;
562
static int ett_docsis_tlv_tcc_oudp;
563
static int ett_docsis_tlv_tcc_err;
564
static int ett_docsis_tlv_sid_cl;
565
static int ett_docsis_tlv_sid_cl_enc;
566
static int ett_docsis_tlv_sid_cl_enc_map;
567
static int ett_docsis_tlv_sid_cl_so;
568
static int ett_docsis_tlv_rcp;
569
static int ett_docsis_tlv_rcp_rcv_mod_enc;
570
static int ett_docsis_tlv_rcp_ch_bl_rng;
571
static int ett_docsis_tlv_rcp_rcv_ch;
572
static int ett_docsis_tlv_rcc;
573
static int ett_docsis_tlv_rcc_rcv_mod_enc;
574
static int ett_docsis_tlv_rcc_rcv_ch;
575
static int ett_docsis_tlv_rcc_partial_serv_down_chan;
576
static int ett_docsis_tlv_rcc_srcc;
577
static int ett_docsis_tlv_rcc_srcc_prim_ds_assign;
578
static int ett_docsis_tlv_rcc_srcc_ds_assign;
579
static int ett_docsis_tlv_rcc_srcc_ds_prof_assign;
580
static int ett_docsis_tlv_rcc_srcc_ds_prof_assign_prof_list;
581
static int ett_docsis_tlv_rcc_err;
582
static int ett_docsis_tlv_dsid;
583
static int ett_docsis_tlv_dsid_ds_reseq;
584
static int ett_docsis_tlv_dsid_mc;
585
static int ett_docsis_tlv_dsid_mc_addr;
586
static int ett_docsis_tlv_sec_assoc;
587
static int ett_docsis_tlv_ch_asgn;
588
static int ett_docsis_cmts_mc_sess_enc;
589
static int ett_docsis_em_id_list_for_cm;
590
static int ett_docsis_tlv_tg_assignment;
591
static int ett_docsis_tlv_unknown;
592
static int ett_docsis_ucd_fragments;
593
static int ett_docsis_ucd_fragment;
594
static int ett_docsis_ucd_reassembled;
595
596
597
static expert_field ei_docsis_tlv_tlvlen_bad;
598
static expert_field ei_docsis_tlv_tlvval_bad;
599
600
601
static const true_false_string ena_dis_tfs = {
602
  "Enable",
603
  "Disable"
604
};
605
606
static const value_string sup_unsup_vals[] = {
607
  {0, "Unsupported"},
608
  {1, "Supported"},
609
  {0, NULL},
610
};
611
612
static const true_false_string sup_unsup_tfs = {
613
  "Supported",
614
  "Unsupported"
615
};
616
617
static const value_string docs_ver_vals[] = {
618
  {0, "v1.0"},
619
  {1, "v1.1"},
620
  {2, "v2.0"},
621
  {3, "v3.0"},
622
  {4, "v3.1"},
623
  {5, "v4.0"},
624
  {0, NULL},
625
};
626
627
static const value_string dsc_act_vals[] = {
628
  {0, "DSC Add Classifier"},
629
  {1, "DSC Replace Classifier"},
630
  {2, "DSC Delete Classifier"},
631
  {0, NULL},
632
};
633
634
static const value_string qos_param_vals[] = {
635
  {0x01, "Apply to provisioned set only"},
636
  {0x02, "Perform admission control add apply to admitted set"},
637
  {0x03, "Apply to provisioned and admitted set; Perform admission control"},
638
  {0x04, "Perform admission control if needed and apply to active set"},
639
  {0x05,
640
   "Apply to provisioned and active sets; Admission control on admitted set in separate service flow, and activate service flow"},
641
  {0x06,
642
   "Perform admission control and activate; Apply to admitted and active sets"},
643
  {0x07,
644
   "Apply to Provisioned, Active and Admitted Sets; Admission Control and Activate Service Flow"},
645
  {0, NULL},
646
};
647
648
static const value_string sched_type_vals[] = {
649
  {0, "Reserved"},
650
  {1, "Undefined (CMTS Dependent)"},
651
  {2, "Best Effort Service"},
652
  {3, "Non-Real-Time Polling Service"},
653
  {4, "Real-Time Polling Service"},
654
  {5, "Unsolicited Grant Service w/Activity Detection"},
655
  {6, "Unsolicited Grant Service"},
656
  {0, NULL},
657
};
658
659
static const value_string action_vals[] = {
660
  {0, "Add PHS Rule"},
661
  {1, "Set PHS Rule"},
662
  {2, "Delete PHS Rule"},
663
  {3, "Delete all PHS Rules"},
664
  {0, NULL},
665
};
666
667
static const value_string dbc_action_vals[] = {
668
  {0, "Add PHS Rule"},
669
  {1, "Delete PHS Rule"},
670
  {0, NULL},
671
};
672
673
#if 0
674
static const true_false_string verify_tfs = {
675
  "Don't Verify",
676
  "Verify"
677
};
678
#endif
679
680
static const value_string rng_tech_vals[] = {
681
  {0, "Perform initial maintenance on new channel"},
682
  {1, "Perform only station maintenance on new channel"},
683
  {2, "Perform either initial maintenance or station maintenance on new channel"},
684
  {3, "Use the new channel directly without performing initial or station maintenance"},
685
  {0, NULL},
686
};
687
688
689
static const value_string docsis_conf_code[] = {
690
  {  0, "okay/success"},
691
  {  1, "Reject: Other/Auth failure (1.0)"},
692
  {  2, "Reject: Unrecognized configuration setting/COS failure (1.0)"},
693
  {  3, "Reject: Temporary/Reject resource"},
694
  {  4, "Reject: Permanent/Reject admin"},
695
  {  5, "Reject: Not owner"},
696
  {  6, "Reject: Service flow not found"},
697
  {  7, "Reject: Service flow exists"},
698
  {  8, "Reject: Required parameter not present"},
699
  {  9, "Reject: Header suppression"},
700
  { 10, "Reject: Unknown transaction ID"},
701
  { 11, "Reject: Authentication failure"},
702
  { 12, "Reject: Add aborted"},
703
  { 13, "Reject: Multiple errors"},
704
  { 14, "Reject: Classifier not found"},
705
  { 15, "Reject: Classifier exists"},
706
  { 16, "Reject: PHS rule not found"},
707
  { 17, "Reject: PHS rule exists"},
708
  { 18, "Reject: Duplicate reference ID or index in message"},
709
  { 19, "Reject: Multiple upstream service flows"},
710
  { 20, "Reject: Multiple downstream service flows"},
711
  { 21, "Reject: Classifier for another service flow"},
712
  { 22, "Reject: PHS for another service flow"},
713
  { 23, "Reject: Parameter invalid for context"},
714
  { 24, "Reject: Authorization failure"},
715
  { 25, "Reject: Temporary DCC"},
716
  { 26, "Reject: Downstream Inconsistency"},
717
  { 27, "Reject: Upstream Inconsistency"},
718
  { 28, "Reject: Insufficient SID Cluster Resources"},
719
  { 29, "Reject: Missing RCP"},
720
  { 30, "Partial Service"},
721
  { 31, "Reject: Temporary DBC"},
722
  { 32, "Reject: Unknown DSID"},
723
  { 33, "Reject: Unknown SID Cluster"},
724
  { 34, "Reject: Invalid Initialization Technique"},
725
  { 35, "Reject: No Change"},
726
  { 36, "Reject: Invalid DBC Request"},
727
  { 37, "Reject: Mode Switch"},
728
  { 38, "Reject: Insufficient Transmitters"},
729
  { 40, "Reject: Insufficient DSID Resources"},
730
  { 41, "Reject: Invalid DSID Encoding"},
731
  { 42, "Reject: Unknown Client MAC Address"},
732
  { 43, "Reject: Unknown SAID"},
733
  { 44, "Reject: Insufficient SA Resources"},
734
  { 45, "Reject: Invalid SA Encoding"},
735
  { 46, "Reject: Invalid SA Crypto Suite"},
736
  { 47, "Reject: TEK Exists"},
737
  { 48, "Reject: Invalid SID Cluster Encoding"},
738
  { 49, "Reject: Insufficient SID Resources"},
739
  { 50, "Reject: Unsupported Parameter Change"},
740
  { 51, "Reject: PHS Rule Fully Defined"},
741
  { 52, "Reject: No MAPs Or UCDs"},
742
  { 53, "Error: T3 Retries Exceeded"},
743
  { 54, "Error: T2 Timeout"},
744
  { 55, "Error: T4 Timeout"},
745
  { 56, "Error: Ranging Abort"},
746
  { 57, "Error: Initialization Channel Timeout"},
747
  { 58, "Error: DBC-REQ Incomplete"},
748
  { 59, "Reject: Too Many OFDMA Profiles"},
749
  { 60, "Reject: Too Many OFDM Profiles"},
750
  { 61, "Reject: EM Incorrect Primary DS"},
751
  { 62, "Reject: AQM Not Supported"},
752
  { 63, "Reject: Invalid DPD"},
753
  {100, "Reject: VLAD ID In Use"},
754
  {101, "Reject: Multipoint L2VPN"},
755
  {102, "Reject: Multipoint NSI"},
756
  {160, "Reject: Unknown RCP ID"},
757
  {161, "Reject: Multiple RCP IDs"},
758
  {162, "Reject: Missing Receive Module Index"},
759
  {163, "Reject: Invalid Receive Module Index"},
760
  {164, "Reject: Invalid Receive Channel Center Frequency"},
761
  {165, "Reject: Invalid Receive Module First Channel Center Frequency"},
762
  {166, "Reject: Missing Receive Module First Channel Center Frequency"},
763
  {167, "Reject: No Primary Downstream Channel Assigned"},
764
  {168, "Reject: Multiple Primary Downstream Channel Assigned"},
765
  {169, "Reject: Receive Module Connectivity Error"},
766
  {170, "Reject: Invalid Receive Channel Index"},
767
  {171, "Reject: Center Frequency Not Multiple of 62500 Hz"},
768
  {180, "Depart"},
769
  {181, "Arrive"},
770
  {182, "Reject: Already There"},
771
  {183, "Reject: Reject 2.0 Disable"},
772
  {200, "Reject: Major Service Flow Error"},
773
  {201, "Reject: Major Classifier Error"},
774
  {202, "Reject: Major PHS Rule Error"},
775
  {203, "Reject: Multiple Major Errors"},
776
  {204, "Reject: Message Syntax Error"},
777
  {205, "Reject: Primary Service Flow Error"},
778
  {206, "Reject: Message Too Big"},
779
  {207, "Reject: Invalid Modem Capabilities"},
780
  {208, "Reject: Bad RCC"},
781
  {209, "Reject: Bad TCC"},
782
  {210, "Reject: Dynamic Range Window Violation"},
783
  {211, "Reject: Unable to support Queue Depth"},
784
  {212, "Reject: Energy Management Parameters"},
785
  {213, "Reject: Invalid Backup Primary Downstream"},
786
  {0, NULL}
787
};
788
789
value_string_ext docsis_conf_code_ext = VALUE_STRING_EXT_INIT(docsis_conf_code);
790
791
static const value_string next_header_vals[] = {
792
  {0, "Hop-by-Hop"},
793
  {60, "Destination"},
794
  {43, "Routing"},
795
  {44, "Fragment"},
796
  {51, "Authentication"},
797
  {50, "Encapsulation"},
798
  {59, "No"},
799
  {256, "All IPv6 Traffic"},
800
  {257, "All UDP and TCP Traffic"},
801
  {0, NULL},
802
};
803
804
static const value_string us_ch_action_vals[] = {
805
  {0, "No Action"},
806
  {1, "Add"},
807
  {2, "Change"},
808
  {3, "Delete"},
809
  {4, "Replace"},
810
  {5, "Re-range"},
811
  {0, NULL},
812
};
813
814
static const value_string init_tech_vals[] = {
815
  {0, "reserved"},
816
  {1, "Perform broadcast initial ranging before normal ops"},
817
  {2, "Perform unicast ranging before normal ops"},
818
  {3, "Perform either broadcast or unicast ranging before normal ops"},
819
  {4, "Use new channel directly without reinitializing or ranging"},
820
  {5, "Perform probing before normal ops"},
821
  {6, "Perform unicast initial ranging before normal ops"},
822
  {7, "Perform station ranging before normal ops"},
823
  {8, "Use FDX channel directly"},
824
  {0, NULL},
825
};
826
827
static const value_string sid_ch_map_vals[] = {
828
  {0, "reserved"},
829
  {1, "Add"},
830
  {2, "Delete"},
831
  {0, NULL},
832
};
833
834
static const value_string mod_or_ch_vals[] = {
835
  {0, "reserved"},
836
  {1, "reserved"},
837
  {2, "reserved"},
838
  {3, "reserved"},
839
  {4, "Receive Module"},
840
  {5, "Receive Channel"},
841
  {0, NULL},
842
};
843
844
static const value_string dsid_action_vals[] = {
845
  {0, "Add"},
846
  {1, "Change"},
847
  {2, "Delete"},
848
  {0, NULL},
849
};
850
851
static const value_string add_del_vals[] = {
852
  {0, "Add"},
853
  {1, "Delete"},
854
  {0, NULL},
855
};
856
857
static const value_string init_reason_vals[] = {
858
  { 0, "reserved"},
859
  { 1, "Power On"},
860
  { 2, "T17 Lost Sync"},
861
  { 3, "All Upstream Failed"},
862
  { 4, "Bad DHCP Ack"},
863
  { 5, "Link Local Address in use"},
864
  { 6, "T6 Expired"},
865
  { 7, "REG-RSP not ok"},
866
  { 8, "BAD RCC/TCC"},
867
  { 9, "Failed Primary Downstream"},
868
  {10, "TCS failed on all upstreams"},
869
  {11, "reserved"},
870
  {12, "reserved"},
871
  {13, "reserved"},
872
  {14, "reserved"},
873
  {15, "MTCM Change"},
874
  {16, "T4 Expired"},
875
  {17, "No Primary SF on US Channel"},
876
  {18, "CM Control Init"},
877
  {19, "Dynamic Range Window Violation"},
878
  {20, "IP Provisioning Mode Override"},
879
  {21, "SW Upgrade Reboot"},
880
  {22, "SNMP Reset"},
881
  {23, "REG-RSP Missing RCC"},
882
  {24, "REG-RSP Missing TCC"},
883
  {25, "REG-RSP MTC Not Enabled"},
884
  {26, "DHCPv6 Bad Reply"},
885
  {27, "Reset Due To Diplexer Change"},
886
  {0, NULL},
887
};
888
889
static const value_string docsis_freq_rng_vals[] = {
890
  {0, "Standard Upstream Frequency Range (5-42 MHz)"},
891
  {1, "Selectable Between Standard (5-42 MHz) and Extended (5-85 MHz) Upstream Frequency Range"},
892
  {2, "Extended Upstream Frequency Range (5-85 MHz)"},
893
  {0, NULL},
894
};
895
896
static const value_string mc_dsid_fwd_vals[] = {
897
  {0, "No support for multicast DSID forwarding"},
898
  {1, "Support for GMAC explicit multicast DSID forwarding"},
899
  {2, "Support for GMAC promiscuous multicast DSID forwarding"},
900
  {0, NULL},
901
};
902
903
static const value_string fctype_fwd_vals[] = {
904
  {0, "Isolation Packet PDU Header (FC_Type of 10) is not forwarded"},
905
  {1, "Isolation Packet PDU Header (FC_Type of 10) is forwarded"},
906
  {0, NULL},
907
};
908
909
static const value_string em_mode_ind_vals[] = {
910
  {0, "Do not operate in any Energy Management Mode"},
911
  {1, "Operate in Energy Management 1x1 Mode"},
912
  {2, "Operate in DOCSIS Light Sleep (DLS) Mode"},
913
  {0, NULL},
914
};
915
916
static const value_string down_reseq_vals[] = {
917
  {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."},
918
  {1, "The CMTS is required to not associate this service flow with a resequencing DSID."},
919
  {0, NULL},
920
};
921
922
static const value_string dipl_up_upper_band_edge_conf_vals[] = {
923
  {0, "Upstream Frequency Range up to 42 MHz"},
924
  {1, "Upstream Frequency Range up to 65 MHz"},
925
  {2, "Upstream Frequency Range up to 85 MHz"},
926
  {3, "Upstream Frequency Range up to 117 MHz"},
927
  {4, "Upstream Frequency Range up to 204 MHz"},
928
  {0, NULL},
929
};
930
931
static const value_string docsis_time_prot_mode_vals[] = {
932
  {0, "DTP operation is not supported"},
933
  {1, "DTP Slave capable only"},
934
  {2, "DTP Master capable only"},
935
  {3, "DTP Master or Slave capable"},
936
  {0, NULL},
937
};
938
939
static const value_string docsis_time_prot_perf_sup_vals[] = {
940
  {0, "DTP mode is not supported"},
941
  {1, "DTP support for DTP Level 1"},
942
  {2, "DTP support for DTP Level 2"},
943
  {3, "DTP support for DTP Level 3"},
944
  {4, "DTP support for DTP Level 4"},
945
  {5, "DTP support for DTP Level 5"},
946
  {6, "DTP supported but with no specified performance"},
947
  {0, NULL},
948
};
949
950
static const value_string rba_type_vals[] = {
951
  {0, "Use RBA-SW"},
952
  {1, "Use RBA-HW"},
953
  {0, NULL},
954
};
955
956
static const value_string fdx_reset_vals[] = {
957
  {0, "Do not reset FDX state"},
958
  {1, "Reset FDX state and restart FDX initialization"},
959
  {0, NULL},
960
};
961
962
static const value_string docsis_mcap_ext_sf_cluster_assign_sup_vals[] = {
963
  {0, "No support"},
964
  {1, "Support available"},
965
  {0, NULL},
966
};
967
968
static const value_string extended_power_options_vals[] = {
969
  {0, "No battery backup"},
970
  {1, "Battery backup"},
971
  {2, "Modem capacitance"},
972
  {0, NULL},
973
};
974
975
static void
976
fourth_db(char *buf, uint32_t value)
977
0
{
978
0
    snprintf(buf, ITEM_LABEL_LENGTH, "%.2f dB", value/4.0);
979
0
}
980
981
static void
982
fourth_dbmv(char *buf, uint32_t value)
983
0
{
984
0
    snprintf(buf, ITEM_LABEL_LENGTH, "%.2f dBmV", value/4.0);
985
0
}
986
987
static reassembly_table ucd_reassembly_table;
988
989
static const fragment_items ucd_frag_items = {
990
  &ett_docsis_ucd_fragment,
991
  &ett_docsis_ucd_fragments,
992
  &hf_docsis_ucd_fragments,
993
  &hf_docsis_ucd_fragment,
994
  &hf_docsis_ucd_fragment_overlap,
995
  &hf_docsis_ucd_fragment_overlap_conflict,
996
  &hf_docsis_ucd_fragment_multiple_tails,
997
  &hf_docsis_ucd_fragment_too_long_fragment,
998
  &hf_docsis_ucd_fragment_error,
999
  &hf_docsis_ucd_fragment_count,
1000
  &hf_docsis_ucd_reassembled_in,
1001
  &hf_docsis_ucd_reassembled_length,
1002
  &hf_docsis_ucd_reassembled_data,
1003
  "UCD fragments"
1004
};
1005
1006
1007
/* Dissection */
1008
static void
1009
0
dissect_unknown_tlv(tvbuff_t * tvb, packet_info *pinfo, proto_tree * tree, int start, uint16_t len) {
1010
0
  unsigned type, length;
1011
0
  proto_tree * unknown_tree;
1012
0
  proto_item * unknown_item;
1013
1014
0
  unknown_item = proto_tree_add_item(tree, hf_docsis_tlv_unknown, tvb, start, len, ENC_NA);
1015
0
  unknown_tree = proto_item_add_subtree(unknown_item, ett_docsis_tlv_unknown);
1016
1017
0
  if (len < 2)
1018
0
    {
1019
0
      expert_add_info_format(pinfo, unknown_item, &ei_docsis_tlv_tlvlen_bad, "Unknown TLV: total length < 2: %u", len);
1020
0
      return;
1021
0
    }
1022
1023
0
  proto_tree_add_item_ret_uint (unknown_tree, hf_docsis_tlv_unknown_type, tvb, start, 1, ENC_BIG_ENDIAN, &type);
1024
0
  proto_tree_add_item_ret_uint (unknown_tree, hf_docsis_tlv_unknown_length, tvb, start + 1, 1, ENC_BIG_ENDIAN, &length);
1025
1026
0
  proto_item_append_text(unknown_item," (Type: %d, Length: %d)", type, length);
1027
1028
0
  if (length + 2 != len)
1029
0
    {
1030
0
      expert_add_info_format(pinfo, unknown_item, &ei_docsis_tlv_tlvlen_bad, "Unknown TLV: Wrong TLV length: %u", length);
1031
0
      return;
1032
0
    }
1033
1034
0
  proto_tree_add_item (unknown_tree, hf_docsis_tlv_unknown_value, tvb, start + 2, len - 2, ENC_NA);
1035
0
}
1036
1037
static void
1038
dissect_phs_err (tvbuff_t * tvb, packet_info *pinfo, proto_tree * tree, int start, uint16_t len)
1039
0
{
1040
0
  uint8_t type, length;
1041
0
  proto_tree *err_tree;
1042
0
  proto_item *err_item;
1043
0
  int pos = start;
1044
1045
0
  err_tree =
1046
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sflow_err, &err_item,
1047
0
                                  "5 Service Flow Error Encodings (Length = %u)", len);
1048
1049
0
  while (pos < (start + len))
1050
0
    {
1051
0
      type = tvb_get_uint8 (tvb, pos++);
1052
0
      length = tvb_get_uint8 (tvb, pos++);
1053
0
      switch (type)
1054
0
        {
1055
0
          case PHS_ERR_PARAM:
1056
0
            if (length == 1)
1057
0
              {
1058
0
                proto_tree_add_item (err_tree, hf_docsis_tlv_phs_err_param, tvb,
1059
0
                                     pos, length, ENC_BIG_ENDIAN);
1060
0
              }
1061
0
            else
1062
0
              {
1063
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1064
0
              }
1065
0
            break;
1066
0
          case PHS_ERR_CODE:
1067
0
            if (length == 1)
1068
0
              {
1069
0
                proto_tree_add_item (err_tree, hf_docsis_tlv_phs_err_code, tvb,
1070
0
                                     pos, length, ENC_BIG_ENDIAN);
1071
0
              }
1072
0
            else
1073
0
              {
1074
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1075
0
              }
1076
0
            break;
1077
0
          case PHS_ERR_MSG:
1078
0
            proto_tree_add_item (err_tree, hf_docsis_tlv_phs_err_msg, tvb, pos,
1079
0
                                 length, ENC_ASCII);
1080
0
            break;
1081
0
          default:
1082
0
            dissect_unknown_tlv (tvb, pinfo, err_tree, pos - 2, length + 2);
1083
0
            break;
1084
0
        }                       /* switch */
1085
0
      pos = pos + length;
1086
1087
0
    }                           /* while */
1088
0
}
1089
1090
static void
1091
dissect_phs (tvbuff_t * tvb, packet_info *pinfo, proto_tree * tree, int start, uint16_t len)
1092
0
{
1093
0
  uint8_t type, length;
1094
0
  proto_tree *phs_tree;
1095
0
  proto_item *phs_item;
1096
0
  int pos = start;
1097
1098
0
  phs_tree =
1099
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_phs, &phs_item,
1100
0
                                  "26 PHS Encodings (Length = %u)", len);
1101
1102
0
  while (pos < (start + len))
1103
0
    {
1104
0
      type = tvb_get_uint8 (tvb, pos++);
1105
0
      length = tvb_get_uint8 (tvb, pos++);
1106
0
      switch (type)
1107
0
        {
1108
0
          case PHS_CLSFR_REF:
1109
0
            if (length == 1)
1110
0
              {
1111
0
                proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_class_ref, tvb,
1112
0
                                     pos, length, ENC_BIG_ENDIAN);
1113
0
              }
1114
0
            else
1115
0
              {
1116
0
                expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1117
0
              }
1118
0
            break;
1119
0
          case PHS_CLSFR_ID:
1120
0
            if (length == 2)
1121
0
              {
1122
0
                proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_class_id, tvb,
1123
0
                                     pos, length, ENC_BIG_ENDIAN);
1124
0
              }
1125
0
            else
1126
0
              {
1127
0
                expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1128
0
              }
1129
0
            break;
1130
0
          case PHS_SFLOW_REF:
1131
0
            if (length == 2)
1132
0
              {
1133
0
                proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_sflow_ref, tvb,
1134
0
                                     pos, length, ENC_BIG_ENDIAN);
1135
0
              }
1136
0
            else
1137
0
              {
1138
0
                expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1139
0
              }
1140
0
            break;
1141
0
          case PHS_SFLOW_ID:
1142
0
            if (length == 4)
1143
0
              {
1144
0
                proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_sflow_id, tvb,
1145
0
                                     pos, length, ENC_BIG_ENDIAN);
1146
0
              }
1147
0
            else
1148
0
              {
1149
0
                expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1150
0
              }
1151
0
            break;
1152
0
          case PHS_DSC_ACTION:
1153
0
            if (length == 1)
1154
0
              {
1155
0
                proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_dsc_action,
1156
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1157
0
              }
1158
0
            else
1159
0
              {
1160
0
                expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1161
0
              }
1162
0
            break;
1163
0
          case PHS_ERRORS:
1164
0
            dissect_phs_err (tvb, pinfo, phs_tree, pos, length);
1165
0
            break;
1166
0
          case PHS_FIELD:
1167
0
            proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phsf, tvb, pos,
1168
0
                                 length, ENC_NA);
1169
0
            break;
1170
0
          case PHS_INDEX:
1171
0
            if (length == 1)
1172
0
              {
1173
0
                proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phsi, tvb, pos,
1174
0
                                     length, ENC_BIG_ENDIAN);
1175
0
              }
1176
0
            else
1177
0
              {
1178
0
                expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1179
0
              }
1180
0
            break;
1181
0
          case PHS_MASK:
1182
0
            proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phsm, tvb, pos,
1183
0
                                 length, ENC_NA);
1184
0
            break;
1185
0
          case PHS_SUP_SIZE:
1186
0
            if (length == 1)
1187
0
              {
1188
0
                proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phss, tvb, pos,
1189
0
                                     length, ENC_BIG_ENDIAN);
1190
0
              }
1191
0
            else
1192
0
              {
1193
0
                expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1194
0
              }
1195
0
            break;
1196
0
          case PHS_VERIFICATION:
1197
0
            if (length == 1)
1198
0
              {
1199
0
                proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_phsf, tvb, pos,
1200
0
                                     length, ENC_NA);
1201
0
              }
1202
0
            else
1203
0
              {
1204
0
                expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1205
0
              }
1206
0
            break;
1207
0
          case PHS_DBC_ACTION:
1208
0
            if (length == 1)
1209
0
              {
1210
0
                proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_dbc_action, tvb, pos,
1211
0
                                     length, ENC_NA);
1212
0
              }
1213
0
            else
1214
0
              {
1215
0
                expert_add_info_format(pinfo, phs_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1216
0
              }
1217
0
            break;
1218
0
          case PHS_VENDOR_SPEC:
1219
0
            proto_tree_add_item (phs_tree, hf_docsis_tlv_phs_vendorspec, tvb,
1220
0
                                 pos, length, ENC_NA);
1221
0
            break;
1222
0
          default:
1223
0
            dissect_unknown_tlv (tvb, pinfo, phs_tree, pos - 2, length + 2);
1224
0
            break;
1225
0
        }                       /* switch */
1226
0
      pos = pos + length;
1227
1228
0
    }                           /* while */
1229
0
}
1230
1231
static const true_false_string tfs_must_not_must = { "MUST NOT", "MUST" };
1232
static const true_false_string tfs_must_must_not = { "MUST", "MUST NOT" };
1233
1234
static void
1235
dissect_reqxmit_policy (tvbuff_t * tvb, proto_tree * tree, int start)
1236
0
{
1237
0
  static int * const requests[] = {
1238
0
    &hf_docsis_tlv_sflow_reqxmit_all_cm_broadcast,
1239
0
    &hf_docsis_tlv_sflow_reqxmit_priority_multicast,
1240
0
    &hf_docsis_tlv_sflow_reqxmit_req_data_requests,
1241
0
    &hf_docsis_tlv_sflow_reqxmit_req_data_data,
1242
0
    &hf_docsis_tlv_sflow_reqxmit_piggy_back,
1243
0
    &hf_docsis_tlv_sflow_reqxmit_concatenate_data,
1244
0
    &hf_docsis_tlv_sflow_reqxmit_fragment,
1245
0
    &hf_docsis_tlv_sflow_reqxmit_suppress_payload,
1246
0
    &hf_docsis_tlv_sflow_reqxmit_drop_packets,
1247
0
    NULL
1248
0
  };
1249
0
  proto_tree_add_bitmask(tree, tvb, start, hf_docsis_tlv_sflow_reqxmit_pol,
1250
0
                         ett_docsis_tlv_reqxmitpol, requests, ENC_BIG_ENDIAN);
1251
0
}
1252
1253
static void
1254
dissect_sflow_err (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
1255
                   uint16_t len)
1256
0
{
1257
0
  uint8_t type, length;
1258
0
  proto_tree *err_tree;
1259
0
  proto_item *err_item;
1260
0
  int pos = start;
1261
1262
0
  err_tree =
1263
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sflow_err, &err_item,
1264
0
                                  "5 Service Flow Error Encodings (Length = %u)", len);
1265
1266
0
  while (pos < (start + len))
1267
0
    {
1268
0
      type = tvb_get_uint8 (tvb, pos++);
1269
0
      length = tvb_get_uint8 (tvb, pos++);
1270
0
      switch (type)
1271
0
        {
1272
0
          case SFW_ERR_PARAM:
1273
0
            if (length == 1)
1274
0
              {
1275
0
                proto_tree_add_item (err_tree, hf_docsis_tlv_sflow_err_param,
1276
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1277
0
              }
1278
0
            else
1279
0
              {
1280
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1281
0
              }
1282
0
            break;
1283
0
          case SFW_ERR_CODE:
1284
0
            if (length == 1)
1285
0
              {
1286
0
                proto_tree_add_item (err_tree, hf_docsis_tlv_sflow_err_code,
1287
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1288
0
              }
1289
0
            else
1290
0
              {
1291
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1292
0
              }
1293
0
            break;
1294
0
          case SFW_ERR_MSG:
1295
0
            proto_tree_add_item (err_tree, hf_docsis_tlv_sflow_err_msg, tvb,
1296
0
                                 pos, length, ENC_ASCII);
1297
0
            break;
1298
0
          default:
1299
0
            dissect_unknown_tlv (tvb, pinfo, err_tree, pos - 2, length + 2);
1300
0
            break;
1301
0
        }                       /* switch */
1302
0
      pos = pos + length;
1303
1304
0
    }                           /* while */
1305
0
}
1306
1307
static void
1308
dissect_downstream_sflow (tvbuff_t * tvb, packet_info* pinfo, proto_tree * sflow_tree,
1309
                          proto_item* sflow_item, int start, uint16_t len)
1310
0
{
1311
0
  uint8_t type, length;
1312
0
  int pos = start;
1313
1314
0
  while (pos < (start + len))
1315
0
    {
1316
0
      type = tvb_get_uint8 (tvb, pos++);
1317
0
      length = tvb_get_uint8 (tvb, pos++);
1318
0
      switch (type)
1319
0
        {
1320
0
        case SFW_MAX_DOWN_LAT:
1321
0
          if (length == 4)
1322
0
            {
1323
0
              proto_tree_add_item (sflow_tree,
1324
0
                                   hf_docsis_tlv_sflow_max_down_latency, tvb,
1325
0
                                   pos, length, ENC_BIG_ENDIAN);
1326
0
            }
1327
0
          else
1328
0
            {
1329
0
              expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1330
0
            }
1331
0
          break;
1332
0
        case SFW_DOWN_RESEQ:
1333
0
          if (length == 1)
1334
0
            {
1335
0
              proto_tree_add_item (sflow_tree,
1336
0
                                   hf_docsis_tlv_sflow_down_reseq, tvb,
1337
0
                                   pos, length, ENC_BIG_ENDIAN);
1338
0
            }
1339
0
          else
1340
0
            {
1341
0
              expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1342
0
            }
1343
0
          break;
1344
0
        default:
1345
0
          dissect_unknown_tlv (tvb, pinfo, sflow_tree, pos - 2, length + 2);
1346
0
          break;
1347
0
        }                       /* switch */
1348
0
      pos = pos + length;
1349
1350
0
    }                           /* while */
1351
0
}
1352
1353
static void
1354
dissect_upstream_sflow (tvbuff_t * tvb, packet_info* pinfo, proto_tree * sflow_tree,
1355
                        proto_item* sflow_item, int start, uint16_t len)
1356
0
{
1357
0
  uint8_t type, length;
1358
0
  int pos = start;
1359
1360
0
  while (pos < (start + len))
1361
0
    {
1362
0
      type = tvb_get_uint8 (tvb, pos++);
1363
0
      length = tvb_get_uint8 (tvb, pos++);
1364
0
      switch (type)
1365
0
        {
1366
0
          case SFW_MAX_CONCAT_BURST:
1367
0
            if (length == 2)
1368
0
              {
1369
0
                proto_tree_add_item (sflow_tree,
1370
0
                                     hf_docsis_tlv_sflow_max_concat_burst, tvb,
1371
0
                                     pos, length, ENC_BIG_ENDIAN);
1372
0
              }
1373
0
            else
1374
0
              {
1375
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1376
0
              }
1377
0
            break;
1378
0
          case SFW_SCHEDULING_TYPE:
1379
0
            if (length == 1)
1380
0
              {
1381
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_sched_type,
1382
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1383
0
              }
1384
0
            else
1385
0
              {
1386
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1387
0
              }
1388
0
            break;
1389
0
          case SFW_REQ_XMIT_POL:
1390
0
            dissect_reqxmit_policy (tvb, sflow_tree, pos);
1391
0
            break;
1392
0
          case SFW_NOM_POLL_INT:
1393
0
            if (length == 4)
1394
0
              {
1395
0
                proto_tree_add_item (sflow_tree,
1396
0
                                     hf_docsis_tlv_sflow_nominal_polling, tvb,
1397
0
                                     pos, length, ENC_BIG_ENDIAN);
1398
0
              }
1399
0
            else
1400
0
              {
1401
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1402
0
              }
1403
0
            break;
1404
0
          case SFW_POLL_JTTR_TOL:
1405
0
            if (length == 4)
1406
0
              {
1407
0
                proto_tree_add_item (sflow_tree,
1408
0
                                     hf_docsis_tlv_sflow_tolerated_jitter, tvb,
1409
0
                                     pos, length, ENC_BIG_ENDIAN);
1410
0
              }
1411
0
            else
1412
0
              {
1413
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1414
0
              }
1415
0
            break;
1416
0
          case SFW_UG_SIZE:
1417
0
            if (length == 2)
1418
0
              {
1419
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_ugs_size,
1420
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1421
0
              }
1422
0
            else
1423
0
              {
1424
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1425
0
              }
1426
0
            break;
1427
0
          case SFW_NOM_GRNT_INTV:
1428
0
            if (length == 4)
1429
0
              {
1430
0
                proto_tree_add_item (sflow_tree,
1431
0
                                     hf_docsis_tlv_sflow_nom_grant_intvl, tvb,
1432
0
                                     pos, length, ENC_BIG_ENDIAN);
1433
0
              }
1434
0
            else
1435
0
              {
1436
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1437
0
              }
1438
0
            break;
1439
0
          case SFW_GRNT_JTTR_TOL:
1440
0
            if (length == 4)
1441
0
              {
1442
0
                proto_tree_add_item (sflow_tree,
1443
0
                                     hf_docsis_tlv_sflow_tol_grant_jitter, tvb,
1444
0
                                     pos, length, ENC_BIG_ENDIAN);
1445
0
              }
1446
0
            else
1447
0
              {
1448
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1449
0
              }
1450
0
            break;
1451
0
          case SFW_GRNTS_PER_INTV:
1452
0
            if (length == 1)
1453
0
              {
1454
0
                proto_tree_add_item (sflow_tree,
1455
0
                                     hf_docsis_tlv_sflow_grants_per_intvl, tvb,
1456
0
                                     pos, length, ENC_BIG_ENDIAN);
1457
0
              }
1458
0
            else
1459
0
              {
1460
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1461
0
              }
1462
0
            break;
1463
0
          case SFW_UG_TIME_REF:
1464
0
            if (length == 4)
1465
0
              {
1466
0
                proto_tree_add_item (sflow_tree,
1467
0
                                     hf_docsis_tlv_sflow_ugs_timeref, tvb, pos,
1468
0
                                     length, ENC_BIG_ENDIAN);
1469
0
              }
1470
0
            else
1471
0
              {
1472
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1473
0
              }
1474
0
            break;
1475
0
          case SFW_CONTENTION_REQ_BACKOFF_WINDOW_MULT:
1476
0
            if (length == 1)
1477
0
              {
1478
0
                proto_tree_add_item (sflow_tree,
1479
0
                                     hf_docsis_tlv_sflow_cont_req_backoff_window_mult, tvb, pos,
1480
0
                                     length, ENC_BIG_ENDIAN);
1481
0
              }
1482
0
            else
1483
0
              {
1484
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1485
0
              }
1486
0
            break;
1487
0
          case SFW_NUM_OF_BYTES_REQUESTED_MULT:
1488
0
            if (length == 1)
1489
0
              {
1490
0
                proto_tree_add_item (sflow_tree,
1491
0
                                     hf_docsis_tlv_sflow_num_of_bytes_requested_mult, tvb, pos,
1492
0
                                     length, ENC_BIG_ENDIAN);
1493
0
                                uint8_t multiplier_val = tvb_get_uint8 (tvb, pos);
1494
0
                                if (multiplier_val != 1 && multiplier_val != 2 && multiplier_val != 4 &&
1495
0
                                    multiplier_val != 8 && multiplier_val != 16)
1496
0
                                    {
1497
0
                                      expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvval_bad,
1498
0
                                                             "Wrong TLV value: %u (should be equal to 1,2,4,8 or 16)", multiplier_val);
1499
0
                                    }
1500
0
              }
1501
0
            else
1502
0
              {
1503
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1504
0
              }
1505
0
            break;
1506
0
          default:
1507
0
            dissect_unknown_tlv (tvb, pinfo, sflow_tree, pos - 2, length + 2);
1508
0
            break;
1509
0
        }                       /* switch */
1510
0
      pos = pos + length;
1511
1512
0
    }                           /* while */
1513
0
}
1514
1515
static void
1516
dissect_sflow (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, uint16_t len,
1517
               uint8_t direction)
1518
0
{
1519
0
  uint8_t type, length;
1520
0
  proto_tree *sflow_tree;
1521
0
  proto_item *sflow_item;
1522
0
  int pos = start;
1523
1524
0
  if (direction == 24)
1525
0
    sflow_tree =
1526
0
      proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr, &sflow_item,
1527
0
                                    "24 Upstream Service Flow (Length = %u)", len);
1528
0
  else if (direction == 25)
1529
0
    sflow_tree =
1530
0
      proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr, &sflow_item,
1531
0
                                    "25 Downstream Service Flow (Length = %u)", len);
1532
0
  else
1533
0
    return;
1534
1535
0
  while (pos < (start + len))
1536
0
    {
1537
0
      type = tvb_get_uint8 (tvb, pos++);
1538
0
      length = tvb_get_uint8 (tvb, pos++);
1539
0
      switch (type)
1540
0
        {
1541
0
          case SFW_REF:
1542
0
            if (length == 2)
1543
0
              {
1544
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_ref, tvb,
1545
0
                                     pos, length, ENC_BIG_ENDIAN);
1546
0
              }
1547
0
            else
1548
0
              {
1549
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1550
0
              }
1551
0
            break;
1552
0
          case SFW_ID:
1553
0
            if (length == 4)
1554
0
              {
1555
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_id, tvb,
1556
0
                                     pos, length, ENC_BIG_ENDIAN);
1557
0
              }
1558
0
            else
1559
0
              {
1560
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1561
0
              }
1562
0
            break;
1563
0
          case SFW_SID:
1564
0
            if (length == 2)
1565
0
              {
1566
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_sid, tvb,
1567
0
                                     pos, length, ENC_BIG_ENDIAN);
1568
0
              }
1569
0
            else
1570
0
              {
1571
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1572
0
              }
1573
0
            break;
1574
0
          case SFW_SERVICE_CLASS_NAME:
1575
0
            proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_classname, tvb,
1576
0
                                 pos, length, ENC_ASCII);
1577
0
            break;
1578
0
          case SFW_ERRORS:
1579
0
            dissect_sflow_err (tvb, pinfo, sflow_tree, pos, length);
1580
0
            break;
1581
0
          case SFW_QOS_SET_TYPE:
1582
0
            if (length == 1)
1583
0
              {
1584
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_qos_param,
1585
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1586
0
              }
1587
0
            else
1588
0
              {
1589
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1590
0
              }
1591
0
            break;
1592
0
          case SFW_TRAF_PRI:
1593
0
            if (length == 1)
1594
0
              {
1595
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_traf_pri,
1596
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1597
0
              }
1598
0
            else
1599
0
              {
1600
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1601
0
              }
1602
0
            break;
1603
0
          case SFW_MAX_SUSTAINED:
1604
0
            if (length == 4)
1605
0
              {
1606
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_max_sus,
1607
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1608
0
              }
1609
0
            else
1610
0
              {
1611
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1612
0
              }
1613
0
            break;
1614
0
          case SFW_MAX_BURST:
1615
0
            if (length == 4)
1616
0
              {
1617
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_max_burst,
1618
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1619
0
              }
1620
0
            else
1621
0
              {
1622
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1623
0
              }
1624
0
            break;
1625
0
          case SFW_MIN_RSVD_TRAF:
1626
0
            if (length == 4)
1627
0
              {
1628
0
                proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_min_traf,
1629
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1630
0
              }
1631
0
            else
1632
0
              {
1633
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1634
0
              }
1635
0
            break;
1636
0
          case SFW_MIN_RSVD_PACKETSIZE:
1637
0
            if (length == 2)
1638
0
              {
1639
0
                proto_tree_add_item (sflow_tree,
1640
0
                                     hf_docsis_tlv_sflow_ass_min_pkt_size, tvb,
1641
0
                                     pos, length, ENC_BIG_ENDIAN);
1642
0
              }
1643
0
            else
1644
0
              {
1645
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1646
0
              }
1647
0
            break;
1648
0
          case SFW_ACTIVE_QOS_TIMEOUT:
1649
0
            if (length == 2)
1650
0
              {
1651
0
                proto_tree_add_item (sflow_tree,
1652
0
                                     hf_docsis_tlv_sflow_timeout_active, tvb,
1653
0
                                     pos, length, ENC_BIG_ENDIAN);
1654
0
              }
1655
0
            else
1656
0
              {
1657
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1658
0
              }
1659
0
            break;
1660
0
          case SFW_ADMITT_QOS_TIMEOUT:
1661
0
            if (length == 2)
1662
0
              {
1663
0
                proto_tree_add_item (sflow_tree,
1664
0
                                     hf_docsis_tlv_sflow_timeout_admitted, tvb,
1665
0
                                     pos, length, ENC_BIG_ENDIAN);
1666
0
              }
1667
0
            else
1668
0
              {
1669
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1670
0
              }
1671
0
            break;
1672
0
          case SFW_IP_TOS_OVERWRITE:
1673
0
            if (length == 2)
1674
0
              {
1675
0
                proto_tree_add_item (sflow_tree,
1676
0
                                     hf_docsis_tlv_sflow_ip_tos_overwrite, tvb,
1677
0
                                     pos, length, ENC_BIG_ENDIAN);
1678
0
              }
1679
0
            else
1680
0
              {
1681
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1682
0
              }
1683
0
            break;
1684
0
          case SFW_PEAK_TRAFFIC_RATE:
1685
0
            if (length == 4)
1686
0
              {
1687
0
                proto_tree_add_item (sflow_tree,
1688
0
                                     hf_docsis_tlv_sflow_peak_traffic_rate, tvb, pos,
1689
0
                                     length, ENC_BIG_ENDIAN);
1690
0
              }
1691
0
            else
1692
0
              {
1693
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1694
0
              }
1695
0
            break;
1696
0
          case SFW_REQUIRED_ATTRIBUTE_MASK:
1697
0
            if (length == 4)
1698
0
              {
1699
0
                proto_tree_add_item (sflow_tree,
1700
0
                                     hf_docsis_tlv_sflow_req_attr_mask, tvb,
1701
0
                                     pos, length, ENC_NA);
1702
0
              }
1703
0
            else
1704
0
              {
1705
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1706
1707
0
              }
1708
0
            break;
1709
0
          case SFW_FORBIDDEN_ATTRIBUTE_MASK:
1710
0
            if (length == 4)
1711
0
              {
1712
0
                proto_tree_add_item (sflow_tree,
1713
0
                                     hf_docsis_tlv_sflow_forb_attr_mask, tvb,
1714
0
                                     pos, length, ENC_NA);
1715
0
              }
1716
0
            else
1717
0
              {
1718
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1719
0
              }
1720
0
            break;
1721
0
          case SFW_ATTRIBUTE_AGGREGATION_RULE_MASK:
1722
0
            if (length == 4)
1723
0
              {
1724
0
                proto_tree_add_item (sflow_tree,
1725
0
                                     hf_docsis_tlv_sflow_attr_aggr_rule_mask, tvb,
1726
0
                                     pos, length, ENC_NA);
1727
0
              }
1728
0
            else
1729
0
              {
1730
0
                expert_add_info_format(pinfo, sflow_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1731
0
              }
1732
0
            break;
1733
0
          case SFW_VENDOR_SPEC:
1734
0
            proto_tree_add_item (sflow_tree, hf_docsis_tlv_sflow_vendor_spec,
1735
0
                                 tvb, pos, length, ENC_NA);
1736
0
            break;
1737
0
          default:
1738
0
            if (direction == 24)
1739
0
              dissect_upstream_sflow (tvb, pinfo, sflow_tree, sflow_item, pos - 2, length);
1740
0
            else
1741
0
              dissect_downstream_sflow (tvb, pinfo, sflow_tree, sflow_item, pos - 2, length);
1742
0
            break;
1743
1744
0
        }                       /* switch (type) */
1745
0
      pos = pos + length;
1746
0
    }                           /* while(pos < start + len) */
1747
1748
0
}
1749
1750
static void
1751
dissect_dot1q_clsfr (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
1752
                     uint16_t len)
1753
0
{
1754
0
  uint8_t type, length;
1755
0
  proto_tree *dot1qclsfr_tree;
1756
0
  proto_item *dot1qclsfr_item;
1757
0
  int pos = start;
1758
1759
0
  dot1qclsfr_tree =
1760
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_cos, &dot1qclsfr_item,
1761
0
                                  "11 801.1P/Q Classifiers (Length = %u)", len);
1762
1763
0
  while (pos < (start + len))
1764
0
    {
1765
0
      type = tvb_get_uint8 (tvb, pos++);
1766
0
      length = tvb_get_uint8 (tvb, pos++);
1767
0
      switch (type)
1768
0
        {
1769
0
          case CFR_D1Q_USER_PRI:
1770
0
            if (length == 2)
1771
0
              {
1772
0
                proto_tree_add_item (dot1qclsfr_tree,
1773
0
                                     hf_docsis_tlv_dot1qclsfr_user_pri, tvb,
1774
0
                                     pos, length, ENC_BIG_ENDIAN);
1775
0
              }
1776
0
            else
1777
0
              {
1778
0
                expert_add_info_format(pinfo, dot1qclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1779
0
              }
1780
0
            break;
1781
0
          case CFR_D1Q_VLAN_ID:
1782
0
            if (length == 2)
1783
0
              {
1784
0
                proto_tree_add_item (dot1qclsfr_tree,
1785
0
                                     hf_docsis_tlv_dot1qclsfr_vlanid, tvb, pos,
1786
0
                                     length, ENC_BIG_ENDIAN);
1787
0
              }
1788
0
            else
1789
0
              {
1790
0
                expert_add_info_format(pinfo, dot1qclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1791
0
              }
1792
0
            break;
1793
0
          case CFR_D1Q_VENDOR_SPEC:
1794
0
            proto_tree_add_item (dot1qclsfr_tree,
1795
0
                                 hf_docsis_tlv_dot1qclsfr_vendorspec, tvb, pos,
1796
0
                                 length, ENC_NA);
1797
0
            break;
1798
0
          default:
1799
0
            dissect_unknown_tlv (tvb, pinfo, dot1qclsfr_tree, pos - 2, length + 2);
1800
0
            break;
1801
0
        }                       /* switch */
1802
0
      pos = pos + length;
1803
1804
0
    }                           /* while */
1805
0
}
1806
1807
static void
1808
dissect_eth_clsfr (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
1809
                   uint16_t len)
1810
0
{
1811
0
  uint8_t type, length;
1812
0
  proto_tree *ethclsfr_tree;
1813
0
  proto_item *ethclsfr_item;
1814
0
  int pos = start;
1815
1816
0
  ethclsfr_tree =
1817
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_eth, &ethclsfr_item,
1818
0
                                  ".10 Ethernet Classifiers (Length = %u)", len);
1819
1820
0
  while (pos < (start + len))
1821
0
    {
1822
0
      type = tvb_get_uint8 (tvb, pos++);
1823
0
      length = tvb_get_uint8 (tvb, pos++);
1824
0
      switch (type)
1825
0
        {
1826
0
          case CFR_ETH_DST_MAC:
1827
0
            if (length == 6)
1828
0
              {
1829
0
                proto_tree_add_item (ethclsfr_tree, hf_docsis_tlv_ethclsfr_dmac,
1830
0
                                     tvb, pos, length, ENC_NA);
1831
0
              }
1832
0
            else
1833
0
              {
1834
0
                expert_add_info_format(pinfo, ethclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1835
0
              }
1836
0
            break;
1837
0
          case CFR_ETH_SRC_MAC:
1838
0
            if (length == 6)
1839
0
              {
1840
0
                proto_tree_add_item (ethclsfr_tree, hf_docsis_tlv_ethclsfr_smac,
1841
0
                                     tvb, pos, length, ENC_NA);
1842
0
              }
1843
0
            else
1844
0
              {
1845
0
                expert_add_info_format(pinfo, ethclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1846
0
              }
1847
0
            break;
1848
0
          case CFR_ETH_DSAP:
1849
0
            if (length == 3)
1850
0
              {
1851
0
                proto_tree_add_item (ethclsfr_tree,
1852
0
                                     hf_docsis_tlv_ethclsfr_ethertype, tvb, pos,
1853
0
                                     length, ENC_BIG_ENDIAN);
1854
0
              }
1855
0
            else
1856
0
              {
1857
0
                expert_add_info_format(pinfo, ethclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1858
0
              }
1859
0
            break;
1860
0
          default:
1861
0
            dissect_unknown_tlv (tvb, pinfo, ethclsfr_tree, pos - 2, length + 2);
1862
0
            break;
1863
0
        }                       /* switch */
1864
0
      pos = pos + length;
1865
1866
0
    }                           /* while */
1867
0
}
1868
1869
static void
1870
dissect_clsfr_err (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
1871
                   uint16_t len)
1872
0
{
1873
0
  uint8_t type, length;
1874
0
  proto_tree *err_tree;
1875
0
  proto_tree *err_item;
1876
0
  int pos = start;
1877
1878
0
  err_tree =
1879
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_err, &err_item,
1880
0
                                  "8 Classifier Error Encodings (Length = %u)", len);
1881
1882
0
  while (pos < (start + len))
1883
0
    {
1884
0
      type = tvb_get_uint8 (tvb, pos++);
1885
0
      length = tvb_get_uint8 (tvb, pos++);
1886
0
      switch (type)
1887
0
        {
1888
0
          case CFR_ERR_PARAM:
1889
0
            if (length == 1)
1890
0
              proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_param, tvb,
1891
0
                                   pos, length, ENC_BIG_ENDIAN);
1892
0
            else if (length == 2)
1893
0
              {
1894
0
                proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_param,
1895
0
                                     tvb, pos, 1, ENC_BIG_ENDIAN);
1896
0
                proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_param,
1897
0
                                     tvb, pos + 1, 1, ENC_BIG_ENDIAN);
1898
0
              }
1899
0
            else
1900
0
              {
1901
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1902
0
              }
1903
0
            break;
1904
0
          case CFR_ERR_CODE:
1905
0
            if (length == 1)
1906
0
              {
1907
0
                proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_code,
1908
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1909
0
              }
1910
0
            else
1911
0
              {
1912
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1913
0
              }
1914
0
            break;
1915
0
          case CFR_ERR_MSG:
1916
0
            proto_tree_add_item (err_tree, hf_docsis_tlv_clsfr_err_msg, tvb,
1917
0
                                 pos, length, ENC_ASCII);
1918
0
            break;
1919
0
          default:
1920
0
            dissect_unknown_tlv (tvb, pinfo, err_tree, pos - 2, length + 2);
1921
0
            break;
1922
0
        }                       /* switch */
1923
0
      pos = pos + length;
1924
1925
0
    }                           /* while */
1926
0
}
1927
1928
static void
1929
dissect_ip_classifier (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
1930
                       uint16_t len)
1931
0
{
1932
0
  uint8_t type, length;
1933
0
  proto_tree *ipclsfr_tree;
1934
0
  proto_tree *ipclsfr_item;
1935
0
  int pos = start;
1936
1937
0
  ipclsfr_tree =
1938
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_ip, &ipclsfr_item,
1939
0
                                  ".9 IP Classifier (Length = %u)", len);
1940
1941
0
  while (pos < (start + len))
1942
0
    {
1943
0
      type = tvb_get_uint8 (tvb, pos++);
1944
0
      length = tvb_get_uint8 (tvb, pos++);
1945
0
      switch (type)
1946
0
        {
1947
0
          case CFR_IP_TOS_RANGE_MASK:
1948
0
            if (length == 3)
1949
0
              {
1950
0
                proto_tree_add_item (ipclsfr_tree,
1951
0
                                     hf_docsis_tlv_ipclsfr_tosmask, tvb, pos,
1952
0
                                     length, ENC_NA);
1953
0
              }
1954
0
            else
1955
0
              {
1956
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1957
0
              }
1958
0
            break;
1959
0
          case CFR_IP_PROTO:
1960
0
            if (length == 2)
1961
0
              {
1962
0
                proto_tree_add_item (ipclsfr_tree,
1963
0
                                     hf_docsis_tlv_ipclsfr_ipproto, tvb, pos,
1964
0
                                     length, ENC_BIG_ENDIAN);
1965
0
              }
1966
0
            else
1967
0
              {
1968
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1969
0
              }
1970
0
            break;
1971
0
          case CFR_IP_SOURCE_ADDR:
1972
0
            if (length == 4)
1973
0
              {
1974
0
                proto_tree_add_item (ipclsfr_tree, hf_docsis_tlv_ipclsfr_src,
1975
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1976
0
              }
1977
0
            else
1978
0
              {
1979
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1980
0
              }
1981
0
            break;
1982
0
          case CFR_IP_SOURCE_MASK:
1983
0
            if (length == 4)
1984
0
              {
1985
0
                proto_tree_add_item (ipclsfr_tree,
1986
0
                                     hf_docsis_tlv_ipclsfr_srcmask, tvb, pos,
1987
0
                                     length, ENC_BIG_ENDIAN);
1988
0
              }
1989
0
            else
1990
0
              {
1991
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
1992
0
              }
1993
0
            break;
1994
0
          case CFR_IP_DEST_ADDR:
1995
0
            if (length == 4)
1996
0
              {
1997
0
                proto_tree_add_item (ipclsfr_tree, hf_docsis_tlv_ipclsfr_dst,
1998
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
1999
0
              }
2000
0
            else
2001
0
              {
2002
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2003
0
              }
2004
0
            break;
2005
0
          case CFR_IP_DEST_MASK:
2006
0
            if (length == 4)
2007
0
              {
2008
0
                proto_tree_add_item (ipclsfr_tree,
2009
0
                                     hf_docsis_tlv_ipclsfr_dstmask, tvb, pos,
2010
0
                                     length, ENC_BIG_ENDIAN);
2011
0
              }
2012
0
            else
2013
0
              {
2014
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2015
0
              }
2016
0
            break;
2017
0
          case CFR_IP_SRCPORT_START:
2018
0
            if (length == 2)
2019
0
              {
2020
0
                proto_tree_add_item (ipclsfr_tree,
2021
0
                                     hf_docsis_tlv_ipclsfr_sport_start, tvb,
2022
0
                                     pos, length, ENC_BIG_ENDIAN);
2023
0
              }
2024
0
            else
2025
0
              {
2026
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2027
0
              }
2028
0
            break;
2029
0
          case CFR_IP_SRCPORT_END:
2030
0
            if (length == 2)
2031
0
              {
2032
0
                proto_tree_add_item (ipclsfr_tree,
2033
0
                                     hf_docsis_tlv_ipclsfr_sport_end, tvb, pos,
2034
0
                                     length, ENC_BIG_ENDIAN);
2035
0
              }
2036
0
            else
2037
0
              {
2038
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2039
0
              }
2040
0
            break;
2041
0
          case CFR_IP_DSTPORT_START:
2042
0
            if (length == 2)
2043
0
              {
2044
0
                proto_tree_add_item (ipclsfr_tree,
2045
0
                                     hf_docsis_tlv_ipclsfr_dport_start, tvb,
2046
0
                                     pos, length, ENC_BIG_ENDIAN);
2047
0
              }
2048
0
            else
2049
0
              {
2050
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2051
0
              }
2052
0
            break;
2053
0
          case CFR_IP_DSTPORT_END:
2054
0
            if (length == 2)
2055
0
              {
2056
0
                proto_tree_add_item (ipclsfr_tree,
2057
0
                                     hf_docsis_tlv_ipclsfr_dport_end, tvb, pos,
2058
0
                                     length, ENC_BIG_ENDIAN);
2059
0
              }
2060
0
            else
2061
0
              {
2062
0
                expert_add_info_format(pinfo, ipclsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2063
0
              }
2064
0
            break;
2065
0
          default:
2066
0
            dissect_unknown_tlv (tvb, pinfo, ipclsfr_tree, pos - 2, length + 2);
2067
0
            break;
2068
0
        }                       /* switch */
2069
0
      pos = pos + length;
2070
2071
0
    }                           /* while */
2072
0
}
2073
2074
static void
2075
dissect_ip6_classifier_tc (tvbuff_t * tvb, proto_tree * tree, int start,
2076
                       uint16_t len)
2077
0
{
2078
0
  proto_tree *ip6clsfr_tc_tree;
2079
0
  proto_tree *ip6clsfr_tc_item;
2080
2081
0
  ip6clsfr_tc_tree = proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_ip6_tc, &ip6clsfr_tc_item,
2082
0
                                "..1 IPv6 Traffic Class Range and Mask");
2083
2084
0
  proto_tree_add_item(ip6clsfr_tc_tree, hf_docsis_tlv_ip6clsfr_tc_low, tvb, start, 1, ENC_BIG_ENDIAN);
2085
0
  proto_tree_add_item(ip6clsfr_tc_tree, hf_docsis_tlv_ip6clsfr_tc_high, tvb, start + 1, 1, ENC_BIG_ENDIAN);
2086
0
  proto_tree_add_item(ip6clsfr_tc_tree, hf_docsis_tlv_ip6clsfr_tc_mask, tvb, start + 2, 1, ENC_BIG_ENDIAN);
2087
2088
0
}
2089
2090
static void
2091
dissect_ip6_classifier (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
2092
                       uint16_t len)
2093
0
{
2094
0
  uint8_t type, length;
2095
0
  proto_tree *ip6clsfr_tree;
2096
0
  proto_tree *ip6clsfr_item;
2097
0
  int pos = start;
2098
2099
2100
0
  ip6clsfr_tree =
2101
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr_ip6, &ip6clsfr_item,
2102
0
                                  ".12 IPv6 Classifier (Length = %u)", len);
2103
2104
0
  while (pos < (start + len))
2105
0
    {
2106
0
      type = tvb_get_uint8 (tvb, pos++);
2107
0
      length = tvb_get_uint8 (tvb, pos++);
2108
0
      switch (type)
2109
0
        {
2110
0
          case CFR_IP6_TRAFFIC_CLASS:
2111
0
            if (length == 3)
2112
0
              {
2113
0
                dissect_ip6_classifier_tc(tvb, ip6clsfr_tree, pos, length);
2114
0
              }
2115
0
            else
2116
0
              {
2117
0
                expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2118
0
              }
2119
0
            break;
2120
0
          case CFR_IP6_FLOW_LABEL:
2121
0
            if (length == 4)
2122
0
              {
2123
0
                proto_tree_add_item (ip6clsfr_tree,
2124
0
                                     hf_docsis_tlv_ip6clsfr_flow_label, tvb, pos,
2125
0
                                     length, ENC_BIG_ENDIAN);
2126
0
              }
2127
0
            else
2128
0
              {
2129
0
                expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2130
0
              }
2131
0
            break;
2132
0
          case CFR_IP6_NEXT_HEADER:
2133
0
            if (length == 2)
2134
0
              {
2135
0
                proto_tree_add_item (ip6clsfr_tree,
2136
0
                                     hf_docsis_tlv_ip6clsfr_next_header, tvb, pos,
2137
0
                                     length, ENC_BIG_ENDIAN);
2138
0
              }
2139
0
            else
2140
0
              {
2141
0
                expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2142
0
              }
2143
0
            break;
2144
0
          case CFR_IP6_SOURCE_ADDR:
2145
0
            if (length == 16)
2146
0
              {
2147
0
                proto_tree_add_item (ip6clsfr_tree,
2148
0
                                     hf_docsis_tlv_ip6clsfr_src, tvb, pos,
2149
0
                                     length, ENC_NA);
2150
0
              }
2151
0
            else
2152
0
              {
2153
0
                expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2154
0
              }
2155
0
            break;
2156
0
          case CFR_IP6_SOURCE_PREFIX_LENGTH:
2157
0
            if (length == 1)
2158
0
              {
2159
0
                proto_tree_add_item (ip6clsfr_tree,
2160
0
                                     hf_docsis_tlv_ip6clsfr_src_prefix_length, tvb, pos,
2161
0
                                     length, ENC_BIG_ENDIAN);
2162
0
              }
2163
0
            else
2164
0
              {
2165
0
                expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2166
0
              }
2167
0
            break;
2168
0
          case CFR_IP6_DESTINATION_ADDR:
2169
0
            if (length == 16)
2170
0
              {
2171
0
                proto_tree_add_item (ip6clsfr_tree,
2172
0
                                     hf_docsis_tlv_ip6clsfr_dst, tvb, pos,
2173
0
                                     length, ENC_NA);
2174
0
              }
2175
0
            else
2176
0
              {
2177
0
                expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2178
0
              }
2179
0
            break;
2180
0
          case CFR_IP6_DESTINATION_PREFIX_LENGTH:
2181
0
            if (length == 1)
2182
0
              {
2183
0
                proto_tree_add_item (ip6clsfr_tree,
2184
0
                                     hf_docsis_tlv_ip6clsfr_dst_prefix_length, tvb, pos,
2185
0
                                     length, ENC_BIG_ENDIAN);
2186
0
              }
2187
0
            else
2188
0
              {
2189
0
                expert_add_info_format(pinfo, ip6clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2190
0
              }
2191
0
            break;
2192
0
          default:
2193
0
            dissect_unknown_tlv (tvb, pinfo, ip6clsfr_tree, pos - 2, length + 2);
2194
0
            break;
2195
0
       }                       /* switch */
2196
0
       pos = pos + length;
2197
0
    }                           /* while */
2198
0
}
2199
2200
static void
2201
dissect_classifiers (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
2202
                     uint16_t len, uint8_t direction)
2203
0
{
2204
0
  uint8_t type, length;
2205
0
  proto_tree *clsfr_tree;
2206
0
  proto_item *clsfr_item;
2207
0
  int pos = start;
2208
2209
0
  if (direction == 22)
2210
0
    clsfr_tree =
2211
0
      proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr, &clsfr_item,
2212
0
                                    "22 Upstream Packet Classifier (Length = %u)",
2213
0
                                    len);
2214
0
  else if (direction == 23)
2215
0
    clsfr_tree =
2216
0
      proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_clsfr, &clsfr_item,
2217
0
                                    "23 Downstream Packet Classifier (Length = %u)",
2218
0
                                    len);
2219
0
  else
2220
0
    return;
2221
2222
0
  while (pos < (start + len))
2223
0
    {
2224
0
      type = tvb_get_uint8 (tvb, pos++);
2225
0
      length = tvb_get_uint8 (tvb, pos++);
2226
0
      switch (type)
2227
0
        {
2228
0
          case CFR_REF:
2229
0
            if (length == 1)
2230
0
              {
2231
0
                proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_ref, tvb,
2232
0
                                     pos, length, ENC_BIG_ENDIAN);
2233
0
              }
2234
0
            else
2235
0
              {
2236
0
                expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2237
0
              }
2238
0
            break;
2239
0
          case CFR_ID:
2240
0
            if (length == 2)
2241
0
              {
2242
0
                proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_id, tvb,
2243
0
                                     pos, length, ENC_BIG_ENDIAN);
2244
0
              }
2245
0
            else
2246
0
              {
2247
0
                expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2248
0
              }
2249
0
            break;
2250
0
          case CFR_SFLOW_REF:
2251
0
            if (length == 2)
2252
0
              {
2253
0
                proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_sflow_ref,
2254
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2255
0
              }
2256
0
            else
2257
0
              {
2258
0
                expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2259
0
              }
2260
0
            break;
2261
0
          case CFR_SFLOW_ID:
2262
0
            if (length == 4)
2263
0
              {
2264
0
                proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_sflow_id,
2265
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2266
0
              }
2267
0
            else
2268
0
              {
2269
0
                expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2270
0
              }
2271
0
            break;
2272
0
          case CFR_RULE_PRI:
2273
0
            if (length == 1)
2274
0
              {
2275
0
                proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_rule_pri,
2276
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2277
0
              }
2278
0
            else
2279
0
              {
2280
0
                expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2281
0
              }
2282
0
            break;
2283
0
          case CFR_ACT_STATE:
2284
0
            if (length == 1)
2285
0
              {
2286
0
                proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_act_state,
2287
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2288
0
              }
2289
0
            else
2290
0
              {
2291
0
                expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2292
0
              }
2293
0
            break;
2294
0
          case CFR_DSA_ACTION:
2295
0
            if (length == 1)
2296
0
              {
2297
0
                proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_dsc_act,
2298
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2299
0
              }
2300
0
            else
2301
0
              {
2302
0
                expert_add_info_format(pinfo, clsfr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2303
0
              }
2304
0
            break;
2305
0
          case CFR_ERROR:
2306
0
            dissect_clsfr_err (tvb, pinfo, clsfr_tree, pos, length);
2307
0
            break;
2308
0
          case CFR_IP_CLASSIFIER:
2309
0
            dissect_ip_classifier (tvb, pinfo, clsfr_tree, pos, length);
2310
0
            break;
2311
0
          case CFR_IP6_CLASSIFIER:
2312
0
            dissect_ip6_classifier (tvb, pinfo, clsfr_tree, pos, length);
2313
0
            break;
2314
0
          case CFR_ETH_CLASSIFIER:
2315
0
            dissect_eth_clsfr (tvb, pinfo, clsfr_tree, pos, length);
2316
0
            break;
2317
0
          case CFR_8021Q_CLASSIFIER:
2318
0
            dissect_dot1q_clsfr (tvb, pinfo, clsfr_tree, pos, length);
2319
0
            break;
2320
0
          case CFR_VENDOR_SPEC:
2321
0
            proto_tree_add_item (clsfr_tree, hf_docsis_tlv_clsfr_vendor_spc,
2322
0
                                 tvb, pos, length, ENC_NA);
2323
0
            break;
2324
0
          default:
2325
0
            dissect_unknown_tlv (tvb, pinfo, clsfr_tree, pos - 2, length + 2);
2326
0
            break;
2327
0
        }                       /* switch */
2328
0
      pos = pos + length;
2329
2330
0
    }                           /* while */
2331
0
}
2332
2333
static void
2334
dissect_doc10cos (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
2335
                  uint16_t len)
2336
0
{
2337
0
  uint8_t type, length;
2338
0
  proto_tree *doc10cos_tree;
2339
0
  proto_tree *doc10cos_item;
2340
0
  int pos = start;
2341
2342
0
  doc10cos_tree =
2343
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_cos, &doc10cos_item,
2344
0
                                  "1 Docsis 1.0 Class of Service (Length = %u)", len);
2345
2346
0
  while (pos < (start + len))
2347
0
    {
2348
0
      type = tvb_get_uint8 (tvb, pos++);
2349
0
      length = tvb_get_uint8 (tvb, pos++);
2350
0
      switch (type)
2351
0
        {
2352
0
          case 1:
2353
0
            if (length == 1)
2354
0
              {
2355
0
                proto_tree_add_item (doc10cos_tree, hf_docsis_tlv_cos_id, tvb,
2356
0
                                     pos, length, ENC_BIG_ENDIAN);
2357
0
              }
2358
0
            else
2359
0
              {
2360
0
                expert_add_info_format(pinfo, doc10cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2361
0
              }
2362
0
            break;
2363
0
          case 2:
2364
0
            if (length == 2)
2365
0
              {
2366
0
                proto_tree_add_item (doc10cos_tree, hf_docsis_tlv_cos_sid, tvb,
2367
0
                                     pos, length, ENC_BIG_ENDIAN);
2368
0
              }
2369
0
            else
2370
0
              {
2371
0
                expert_add_info_format(pinfo, doc10cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2372
0
              }
2373
0
            break;
2374
0
          default:
2375
0
            dissect_unknown_tlv (tvb, pinfo, doc10cos_tree, pos - 2, length + 2);
2376
0
            break;
2377
0
        }                       /* switch */
2378
0
      pos = pos + length;
2379
2380
0
    }                           /* while */
2381
0
}
2382
2383
static void
2384
dissect_modemcap (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start,
2385
                  uint16_t len)
2386
0
{
2387
0
  uint8_t type, length;
2388
0
  uint32_t tlv_value;
2389
0
  proto_tree *mcap_tree, *tlv_tree;
2390
0
  proto_tree *mcap_item, *tlv_item;
2391
0
  int pos = start;
2392
2393
0
  mcap_tree =
2394
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_mcap, &mcap_item,
2395
0
                                  "5 Modem Capabilities Type (Length = %u)", len);
2396
2397
0
  while (pos < (start + len))
2398
0
    {
2399
0
      type = tvb_get_uint8 (tvb, pos++);
2400
0
      length = tvb_get_uint8 (tvb, pos++);
2401
0
      switch (type)
2402
0
        {
2403
0
          case CAP_CONCAT:
2404
0
            if (length == 1)
2405
0
              {
2406
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_concat, tvb,
2407
0
                                     pos, length, ENC_BIG_ENDIAN);
2408
0
              }
2409
0
            else
2410
0
              {
2411
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2412
0
              }
2413
0
            break;
2414
0
          case CAP_DOCSIS_VER:
2415
0
            if (length == 1)
2416
0
              {
2417
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_docs_ver,
2418
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2419
0
              }
2420
0
            else
2421
0
              {
2422
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2423
0
              }
2424
0
            break;
2425
0
          case CAP_FRAG:
2426
0
            if (length == 1)
2427
0
              {
2428
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_frag, tvb,
2429
0
                                     pos, length, ENC_BIG_ENDIAN);
2430
0
              }
2431
0
            else
2432
0
              {
2433
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2434
0
              }
2435
0
            break;
2436
0
          case CAP_PHS:
2437
0
            if (length == 1)
2438
0
              {
2439
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_phs, tvb,
2440
0
                                     pos, length, ENC_BIG_ENDIAN);
2441
0
              }
2442
0
            else
2443
0
              {
2444
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2445
0
              }
2446
0
            break;
2447
0
          case CAP_IGMP:
2448
0
            if (length == 1)
2449
0
              {
2450
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_igmp, tvb,
2451
0
                                     pos, length, ENC_BIG_ENDIAN);
2452
0
              }
2453
0
            else
2454
0
              {
2455
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2456
0
              }
2457
0
            break;
2458
0
          case CAP_PRIVACY:
2459
0
            if (length == 1)
2460
0
              {
2461
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_privacy, tvb,
2462
0
                                     pos, length, ENC_BIG_ENDIAN);
2463
0
              }
2464
0
            else
2465
0
              {
2466
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2467
0
              }
2468
0
            break;
2469
0
          case CAP_DOWN_SAID:
2470
0
            if (length == 1)
2471
0
              {
2472
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_down_said,
2473
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2474
0
              }
2475
0
            else
2476
0
              {
2477
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2478
0
              }
2479
0
            break;
2480
0
          case CAP_UP_SID:
2481
0
            if (length == 1)
2482
0
              {
2483
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_up_sid, tvb,
2484
0
                                     pos, length, ENC_BIG_ENDIAN);
2485
0
              }
2486
0
            else
2487
0
              {
2488
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2489
0
              }
2490
0
            break;
2491
0
          case CAP_OPT_FILT:
2492
0
            if (length == 1)
2493
0
              {
2494
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_8021P_filter,
2495
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2496
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_8021Q_filter,
2497
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2498
0
              }
2499
0
            else
2500
0
              {
2501
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2502
0
              }
2503
0
            break;
2504
0
          case CAP_XMIT_EQPERSYM:
2505
0
            if (length == 1)
2506
0
              {
2507
0
                proto_tree_add_item (mcap_tree,
2508
0
                                     hf_docsis_tlv_mcap_xmit_eq_taps_per_sym,
2509
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2510
0
              }
2511
0
            else
2512
0
              {
2513
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2514
0
              }
2515
0
            break;
2516
0
          case CAP_NUM_XMIT_EQ_TAPS:
2517
0
            if (length == 1)
2518
0
              {
2519
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_xmit_eq_taps,
2520
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
2521
0
              }
2522
0
            else
2523
0
              {
2524
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2525
0
              }
2526
0
            break;
2527
0
          case CAP_DCC:
2528
0
            if (length == 1)
2529
0
              {
2530
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dcc, tvb,
2531
0
                                     pos, length, ENC_BIG_ENDIAN);
2532
0
              }
2533
0
            else
2534
0
              {
2535
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2536
0
              }
2537
0
            break;
2538
0
          case CAP_IP_FILTERS:
2539
0
            if (length == 2)
2540
0
              {
2541
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ip_filters, tvb,
2542
0
                                     pos, length, ENC_BIG_ENDIAN);
2543
0
              }
2544
0
            else
2545
0
              {
2546
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2547
0
              }
2548
0
            break;
2549
0
          case CAP_LLC_FILTERS:
2550
0
            if (length == 2)
2551
0
              {
2552
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_llc_filters, tvb,
2553
0
                                     pos, length, ENC_BIG_ENDIAN);
2554
0
              }
2555
0
            else
2556
0
              {
2557
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2558
0
              }
2559
0
            break;
2560
0
          case CAP_EXP_UNICAST_SID:
2561
0
            if (length == 1)
2562
0
              {
2563
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_exp_unicast_sid, tvb,
2564
0
                                     pos, length, ENC_BIG_ENDIAN);
2565
0
              }
2566
0
            else
2567
0
              {
2568
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2569
0
              }
2570
0
            break;
2571
0
          case CAP_RNG_HOFF:
2572
0
            if (length == 4)
2573
0
              {
2574
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_rnghoff_cm, tvb,
2575
0
                                     pos, length, ENC_BIG_ENDIAN);
2576
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_rnghoff_erouter, tvb,
2577
0
                                     pos, length, ENC_BIG_ENDIAN);
2578
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_rnghoff_emta, tvb,
2579
0
                                     pos, length, ENC_BIG_ENDIAN);
2580
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_rnghoff_estb, tvb,
2581
0
                                     pos, length, ENC_BIG_ENDIAN);
2582
0
              }
2583
0
            else
2584
0
              {
2585
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2586
0
              }
2587
0
            break;
2588
0
          case CAP_L2VPN:
2589
0
            proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_l2vpn, tvb,
2590
0
                                 pos, length, ENC_NA);
2591
0
            break;
2592
0
          case CAP_L2VPN_ESAFE:
2593
0
            proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_l2vpn_esafe, tvb,
2594
0
                                 pos, length, ENC_NA);
2595
0
            break;
2596
0
          case CAP_DUT_FILTERING:
2597
0
            proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dut_filtering, tvb,
2598
0
                                 pos, length, ENC_NA);
2599
0
            break;
2600
0
          case CAP_US_FREQ_RNG:
2601
0
            if (length == 1)
2602
0
              {
2603
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_freq_range, tvb,
2604
0
                                     pos, length, ENC_BIG_ENDIAN);
2605
0
              }
2606
0
            else
2607
0
              {
2608
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2609
0
              }
2610
0
            break;
2611
0
          case CAP_US_SRATE:
2612
0
            if (length == 1)
2613
0
              {
2614
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_160, tvb,
2615
0
                                     pos, length, ENC_BIG_ENDIAN);
2616
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_320, tvb,
2617
0
                                     pos, length, ENC_BIG_ENDIAN);
2618
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_640, tvb,
2619
0
                                     pos, length, ENC_BIG_ENDIAN);
2620
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_1280, tvb,
2621
0
                                     pos, length, ENC_BIG_ENDIAN);
2622
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_2560, tvb,
2623
0
                                     pos, length, ENC_BIG_ENDIAN);
2624
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_us_srate_5120, tvb,
2625
0
                                     pos, length, ENC_BIG_ENDIAN);
2626
0
              }
2627
0
            else
2628
0
              {
2629
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2630
0
              }
2631
0
            break;
2632
0
          case CAP_SAC:
2633
0
            if (length == 1)
2634
0
              {
2635
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_sac, tvb,
2636
0
                                     pos, length, ENC_BIG_ENDIAN);
2637
0
              }
2638
0
            else
2639
0
              {
2640
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2641
0
              }
2642
0
            break;
2643
0
          case CAP_CODE_HOP_M2:
2644
0
            if (length == 1)
2645
0
              {
2646
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_code_hop_mode2, tvb,
2647
0
                                     pos, length, ENC_BIG_ENDIAN);
2648
0
              }
2649
0
            else
2650
0
              {
2651
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2652
0
              }
2653
0
            break;
2654
0
          case CAP_MTC:
2655
0
            if (length == 1)
2656
0
              {
2657
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_mtc, tvb,
2658
0
                                     pos, length, ENC_BIG_ENDIAN);
2659
0
              }
2660
0
            else
2661
0
              {
2662
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2663
0
              }
2664
0
            break;
2665
0
          case CAP_512_MSPS_UTC:
2666
0
            if (length == 1)
2667
0
              {
2668
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_512_msps_utc, tvb,
2669
0
                                     pos, length, ENC_BIG_ENDIAN);
2670
0
              }
2671
0
            else
2672
0
              {
2673
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2674
0
              }
2675
0
            break;
2676
0
          case CAP_256_MSPS_UTC:
2677
0
            if (length == 1)
2678
0
              {
2679
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_256_msps_utc, tvb,
2680
0
                                     pos, length, ENC_BIG_ENDIAN);
2681
0
              }
2682
0
            else
2683
0
              {
2684
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2685
0
              }
2686
0
            break;
2687
0
          case CAP_TOTAL_SID_CLUST:
2688
0
            if (length == 1)
2689
0
              {
2690
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_total_sid_cluster, tvb,
2691
0
                                     pos, length, ENC_BIG_ENDIAN);
2692
0
              }
2693
0
            else
2694
0
              {
2695
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2696
0
              }
2697
0
            break;
2698
0
          case CAP_SID_PER_SF:
2699
0
            if (length == 1)
2700
0
              {
2701
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_sid_per_sf, tvb,
2702
0
                                     pos, length, ENC_BIG_ENDIAN);
2703
0
              }
2704
0
            else
2705
0
              {
2706
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2707
0
              }
2708
0
            break;
2709
0
          case CAP_MRC:
2710
0
            if (length == 1)
2711
0
              {
2712
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_mrc, tvb,
2713
0
                                     pos, length, ENC_BIG_ENDIAN);
2714
0
              }
2715
0
            else
2716
0
              {
2717
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2718
0
              }
2719
0
            break;
2720
0
          case CAP_TOTAL_DSID:
2721
0
            if (length == 1)
2722
0
              {
2723
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_total_dsid, tvb,
2724
0
                                     pos, length, ENC_BIG_ENDIAN);
2725
0
              }
2726
0
            else
2727
0
              {
2728
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2729
0
              }
2730
0
            break;
2731
0
          case CAP_RESEQ_DSID:
2732
0
            if (length == 1)
2733
0
              {
2734
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_reseq_dsid, tvb,
2735
0
                                     pos, length, ENC_BIG_ENDIAN);
2736
0
              }
2737
0
            else
2738
0
              {
2739
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2740
0
              }
2741
0
            break;
2742
0
          case CAP_MC_DSID:
2743
0
            if (length == 1)
2744
0
              {
2745
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_mc_dsid, tvb,
2746
0
                                     pos, length, ENC_BIG_ENDIAN);
2747
0
              }
2748
0
            else
2749
0
              {
2750
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2751
0
              }
2752
0
            break;
2753
0
          case CAP_MC_DSID_FWD:
2754
0
            if (length == 1)
2755
0
              {
2756
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_mc_dsid_fwd, tvb,
2757
0
                                     pos, length, ENC_BIG_ENDIAN);
2758
0
              }
2759
0
            else
2760
0
              {
2761
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2762
0
              }
2763
0
            break;
2764
0
          case CAP_FCTYPE_FWD:
2765
0
            if (length == 1)
2766
0
              {
2767
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_fctype_fwd, tvb,
2768
0
                                     pos, length, ENC_BIG_ENDIAN);
2769
0
              }
2770
0
            else
2771
0
              {
2772
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2773
0
              }
2774
0
            break;
2775
0
          case CAP_DPV:
2776
0
            if (length == 1)
2777
0
              {
2778
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dpv_path, tvb,
2779
0
                                     pos, length, ENC_BIG_ENDIAN);
2780
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dpv_packet, tvb,
2781
0
                                     pos, length, ENC_BIG_ENDIAN);
2782
0
              }
2783
0
            else
2784
0
              {
2785
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2786
0
              }
2787
0
            break;
2788
0
          case CAP_UGS:
2789
0
            if (length == 1)
2790
0
              {
2791
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ugs, tvb,
2792
0
                                     pos, length, ENC_BIG_ENDIAN);
2793
0
              }
2794
0
            else
2795
0
              {
2796
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2797
0
              }
2798
0
            break;
2799
0
          case CAP_MAP_UCD:
2800
0
            if (length == 1)
2801
0
              {
2802
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_map_ucd, tvb,
2803
0
                                     pos, length, ENC_BIG_ENDIAN);
2804
0
              }
2805
0
            else
2806
0
              {
2807
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2808
0
              }
2809
0
            break;
2810
0
          case CAP_UDC:
2811
0
            if (length == 2)
2812
0
              {
2813
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_udc, tvb,
2814
0
                                     pos, length, ENC_BIG_ENDIAN);
2815
0
              }
2816
0
            else
2817
0
              {
2818
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2819
0
              }
2820
0
            break;
2821
0
          case CAP_IPV6:
2822
0
            if (length == 1)
2823
0
              {
2824
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ipv6, tvb,
2825
0
                                     pos, length, ENC_BIG_ENDIAN);
2826
0
              }
2827
0
            else
2828
0
              {
2829
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2830
0
              }
2831
0
            break;
2832
0
          case CAP_EXT_US_TRNS_PWR:
2833
0
            if (length == 1)
2834
0
              {
2835
0
                unsigned power_raw;
2836
0
                proto_item * power_cap_it = proto_tree_add_item_ret_uint (mcap_tree, hf_docsis_tlv_mcap_ext_us_trans_power,
2837
0
                                                                          tvb, pos, length, ENC_BIG_ENDIAN, &power_raw);
2838
0
                proto_item_append_text(power_cap_it, " (%.2f dB)", power_raw * 0.25);
2839
0
              }
2840
0
            else
2841
0
              {
2842
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2843
0
              }
2844
0
            break;
2845
0
          case CAP_EM:
2846
0
            if (length == 4)
2847
0
              {
2848
0
                static int * const cap_em[] = {
2849
0
                  &hf_docsis_tlv_mcap_em_1x1,
2850
0
                  &hf_docsis_tlv_mcap_em_light_sleep,
2851
0
                  NULL
2852
0
                };
2853
2854
0
                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);
2855
0
              }
2856
0
            else
2857
0
              {
2858
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2859
0
              }
2860
0
            break;
2861
0
          case CAP_CM_STATUS_ACK:
2862
0
            if (length == 1)
2863
0
              {
2864
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_cm_status_ack, tvb,
2865
0
                                     pos, length, ENC_BIG_ENDIAN);
2866
0
              }
2867
0
            else
2868
0
              {
2869
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2870
0
              }
2871
0
            break;
2872
0
          case CAP_EM_PREF:
2873
0
            if (length == 4)
2874
0
              {
2875
0
                static int * const em_pref[] = {
2876
0
                  &hf_docsis_tlv_mcap_em_pref_1x1,
2877
0
                  &hf_docsis_tlv_mcap_em_pref_dls,
2878
0
                  NULL
2879
0
                };
2880
2881
0
                proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_em_pref,
2882
0
                         ett_docsis_tlv_mcap_em_pref, em_pref, ENC_BIG_ENDIAN);
2883
0
              }
2884
0
            else
2885
0
              {
2886
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2887
0
              }
2888
0
            break;
2889
0
          case CAP_EXT_PKT_LEN_SUP_CAP:
2890
0
            if (length == 2)
2891
0
              {
2892
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ext_pkt_len_sup_cap, tvb,
2893
0
                                     pos, length, ENC_BIG_ENDIAN);
2894
0
              }
2895
0
            else
2896
0
              {
2897
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2898
0
              }
2899
0
            break;
2900
0
          case CAP_OFDM_MULT_RECV_CHAN_SUP:
2901
0
            if (length == 1)
2902
0
              {
2903
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ofdm_mult_recv_chan_sup, tvb,
2904
0
                                     pos, length, ENC_BIG_ENDIAN);
2905
0
              }
2906
0
            else
2907
0
              {
2908
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2909
0
              }
2910
0
            break;
2911
0
          case CAP_OFDMA_MULT_TRANS_CHAN_SUP:
2912
0
            if (length == 1)
2913
0
              {
2914
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ofdma_mult_trans_chan_sup, tvb,
2915
0
                                     pos, length, ENC_BIG_ENDIAN);
2916
0
              }
2917
0
            else
2918
0
              {
2919
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2920
0
              }
2921
0
            break;
2922
0
          case CAP_DOWN_OFDM_PROF_SUP:
2923
0
            if (length == 1)
2924
0
              {
2925
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_down_ofdm_prof_sup, tvb,
2926
0
                                     pos, length, ENC_BIG_ENDIAN);
2927
0
              }
2928
0
            else
2929
0
              {
2930
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2931
0
              }
2932
0
            break;
2933
0
          case CAP_DOWN_OFDM_CHAN_SUBC_QAM_MOD_SUP:
2934
0
            if (length == 2)
2935
0
              {
2936
0
                static int * const ofdm_qam_mod_sup[] = {
2937
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_reserved,
2938
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_qpsk,
2939
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16qam,
2940
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_64qam,
2941
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_128qam,
2942
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_256qam,
2943
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_512qam,
2944
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_1024qam,
2945
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_2048qam,
2946
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_4096qam,
2947
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_8192qam,
2948
0
                  &hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16384qam,
2949
0
                  NULL
2950
0
                };
2951
2952
0
                proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup,
2953
0
                         ett_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup, ofdm_qam_mod_sup, ENC_BIG_ENDIAN);
2954
0
              }
2955
0
            else
2956
0
              {
2957
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2958
0
              }
2959
0
            break;
2960
0
          case CAP_UP_OFDMA_CHAN_SUBC_QAM_MOD_SUP:
2961
0
            if (length == 2)
2962
0
              {
2963
0
                static int * const ofdma_qam_mod_sup[] = {
2964
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_reserved,
2965
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_qpsk,
2966
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8qam,
2967
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16qam,
2968
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_32qam,
2969
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_64qam,
2970
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_128qam,
2971
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_256qam,
2972
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_512qam,
2973
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_1024qam,
2974
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_2048qam,
2975
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_4096qam,
2976
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8192qam,
2977
0
                  &hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16384qam,
2978
0
                  NULL
2979
0
                };
2980
2981
0
                proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup,
2982
0
                         ett_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup, ofdma_qam_mod_sup, ENC_BIG_ENDIAN);
2983
0
              }
2984
0
            else
2985
0
              {
2986
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
2987
0
              }
2988
0
            break;
2989
0
          case CAP_DOWN_LOWER_BAND_EDGE_CONF:
2990
0
            if (length == 1)
2991
0
              {
2992
0
                static int * const down_lower_band_edge_conf[] = {
2993
0
                  &hf_docsis_tlv_mcap_down_lower_band_edge_conf_108,
2994
0
                  &hf_docsis_tlv_mcap_down_lower_band_edge_conf_258,
2995
0
                  NULL
2996
0
                };
2997
2998
0
                proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_down_lower_band_edge_conf,
2999
0
                         ett_docsis_tlv_mcap_down_lower_band_edge_conf, down_lower_band_edge_conf, ENC_BIG_ENDIAN);
3000
0
              }
3001
0
            else
3002
0
              {
3003
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3004
0
              }
3005
0
            break;
3006
0
          case CAP_DOWN_UPPER_BAND_EDGE_CONF:
3007
0
            if (length == 1)
3008
0
              {
3009
0
                static int * const down_upper_band_edge_conf[] = {
3010
0
                  &hf_docsis_tlv_mcap_down_upper_band_edge_conf_1218,
3011
0
                  &hf_docsis_tlv_mcap_down_upper_band_edge_conf_1794,
3012
0
                  &hf_docsis_tlv_mcap_down_upper_band_edge_conf_1002,
3013
0
                  NULL
3014
0
                };
3015
3016
0
                proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_down_upper_band_edge_conf,
3017
0
                         ett_docsis_tlv_mcap_down_upper_band_edge_conf, down_upper_band_edge_conf, ENC_BIG_ENDIAN);
3018
0
              }
3019
0
            else
3020
0
              {
3021
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3022
0
              }
3023
0
            break;
3024
0
          case CAP_DIPL_UP_UPPER_BAND_EDGE_CONF:
3025
0
            if (length == 1)
3026
0
              {
3027
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_dipl_up_upper_band_edge_conf, tvb,
3028
0
                                     pos, length, ENC_BIG_ENDIAN);
3029
0
              }
3030
0
            else
3031
0
              {
3032
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3033
0
              }
3034
0
            break;
3035
0
          case CAP_DOCSIS_TIME_PROT_MODE:
3036
0
            if (length == 1)
3037
0
              {
3038
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_docsis_time_prot_mode, tvb,
3039
0
                                     pos, length, ENC_BIG_ENDIAN);
3040
0
              }
3041
0
            else
3042
0
              {
3043
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3044
0
              }
3045
0
            break;
3046
0
          case CAP_DOCSIS_TIME_PROT_PERF_SUP:
3047
0
            if (length == 1)
3048
0
              {
3049
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_docsis_time_prot_perf_sup, tvb,
3050
0
                                     pos, length, ENC_BIG_ENDIAN);
3051
0
              }
3052
0
            else
3053
0
              {
3054
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3055
0
              }
3056
0
            break;
3057
0
          case CAP_PMAX:
3058
0
            if (length == 2)
3059
0
              {
3060
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_pmax, tvb,
3061
0
                                     pos, length, ENC_BIG_ENDIAN);
3062
0
              }
3063
0
            else
3064
0
              {
3065
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3066
0
              }
3067
0
            break;
3068
0
          case CAP_DIPL_DOWN_LOWER_BAND_EDGE:
3069
0
            if (length == 1)
3070
0
              {
3071
0
                static int * const dipl_down_lower_band_edge[] = {
3072
0
                  &hf_docsis_tlv_mcap_dipl_down_lower_band_edge_108,
3073
0
                  &hf_docsis_tlv_mcap_dipl_down_lower_band_edge_258,
3074
0
                  NULL
3075
0
                };
3076
3077
0
                proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_dipl_down_lower_band_edge,
3078
0
                         ett_docsis_tlv_mcap_dipl_down_lower_band_edge, dipl_down_lower_band_edge, ENC_BIG_ENDIAN);
3079
0
              }
3080
0
            else
3081
0
              {
3082
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3083
0
              }
3084
0
            break;
3085
0
          case CAP_DIPL_DOWN_UPPER_BAND_EDGE:
3086
0
            if (length == 1)
3087
0
              {
3088
0
                static int * const dipl_down_upper_band_edge[] = {
3089
0
                  &hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1218,
3090
0
                  &hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1794,
3091
0
                  &hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1002,
3092
0
                  NULL
3093
0
                };
3094
3095
0
                proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_dipl_down_upper_band_edge,
3096
0
                         ett_docsis_tlv_mcap_dipl_down_upper_band_edge, dipl_down_upper_band_edge, ENC_BIG_ENDIAN);
3097
0
              }
3098
0
            else
3099
0
              {
3100
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3101
0
              }
3102
0
            break;
3103
0
          case CAP_DIPL_UP_UPPER_BAND_EDGE:
3104
0
            if (length == 1)
3105
0
              {
3106
0
                static int * const dipl_up_upper_band_edge[] = {
3107
0
                  &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_42,
3108
0
                  &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_65,
3109
0
                  &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_85,
3110
0
                  &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_117,
3111
0
                  &hf_docsis_tlv_mcap_dipl_up_upper_band_edge_204,
3112
0
                  NULL
3113
0
                };
3114
3115
0
                proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_dipl_up_upper_band_edge,
3116
0
                         ett_docsis_tlv_mcap_dipl_up_upper_band_edge, dipl_up_upper_band_edge, ENC_BIG_ENDIAN);
3117
0
              }
3118
0
            else
3119
0
              {
3120
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3121
0
              }
3122
0
            break;
3123
0
          case CAP_ADVANCED_BAND_PLAN:
3124
0
            if (length == 1)
3125
0
              {
3126
0
                static int * const advanved_band_plan[] = {
3127
0
                  &hf_docsis_tlv_mcap_advanced_band_plan_fdx_l,
3128
0
                  &hf_docsis_tlv_mcap_advanced_band_plan_fdx,
3129
0
                  &hf_docsis_tlv_mcap_advanced_band_plan_fdd,
3130
0
                  &hf_docsis_tlv_mcap_advanced_band_plan_reserved,
3131
0
                  NULL
3132
0
                };
3133
3134
0
                proto_tree_add_bitmask(mcap_tree, tvb, pos, hf_docsis_tlv_mcap_advanced_band_plan,
3135
0
                         ett_docsis_tlv_mcap_advanced_band_plan, advanved_band_plan, ENC_BIG_ENDIAN);
3136
0
              }
3137
0
            else
3138
0
              {
3139
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3140
0
              }
3141
0
            break;
3142
0
          case CAP_EXTENDED_SF_SID_CLUSTER_ASSIGN:
3143
0
            if (length == 1)
3144
0
              {
3145
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_ext_sf_cluster_assign_sup, tvb,
3146
0
                                     pos, length, ENC_BIG_ENDIAN);
3147
0
              }
3148
0
            else
3149
0
              {
3150
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3151
0
              }
3152
0
            break;
3153
0
          case CAP_LOW_LATENCY_SUP:
3154
0
            if (length == 1)
3155
0
              {
3156
0
                tlv_item = proto_tree_add_item_ret_uint (mcap_tree, hf_docsis_tlv_mcap_low_latency_sup, tvb,
3157
0
                                      pos, length, ENC_BIG_ENDIAN, &tlv_value);
3158
0
                if (tlv_value > 0)
3159
0
                  {
3160
0
                    proto_item_append_text(tlv_item, " %s", (tlv_value == 1) ? "ASF" : "ASFs" );
3161
0
                  }
3162
0
              }
3163
0
            else
3164
0
              {
3165
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3166
0
              }
3167
0
            break;
3168
0
          case CAP_ADVANCED_DOWN_LOWER_BAND_EDGE_CONF:
3169
0
            if (length == 2)
3170
0
              {
3171
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_adv_down_lower_band_edge_conf, tvb,
3172
0
                                     pos, length, ENC_BIG_ENDIAN);
3173
0
              }
3174
0
            else
3175
0
              {
3176
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3177
0
              }
3178
0
            break;
3179
0
          case CAP_ADVANCED_DOWN_UPPER_BAND_EDGE_CONF:
3180
0
            if (length == 2)
3181
0
              {
3182
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_adv_down_upper_band_edge_conf, tvb,
3183
0
                                     pos, length, ENC_BIG_ENDIAN);
3184
0
              }
3185
0
            else
3186
0
              {
3187
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3188
0
              }
3189
0
            break;
3190
0
          case CAP_ADVANCED_UP_UPPER_BAND_EDGE_CONF:
3191
0
            if (length == 2)
3192
0
              {
3193
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_adv_up_upper_band_edge_conf, tvb,
3194
0
                                     pos, length, ENC_BIG_ENDIAN);
3195
0
              }
3196
0
            else
3197
0
              {
3198
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3199
0
              }
3200
0
            break;
3201
0
          case CAP_ADVANCED_DOWN_LOWER_BAND_EDGE_OPTIONS_LIST:
3202
0
            if (length > 0 && length % 2 == 0)
3203
0
              {
3204
0
                tlv_tree = proto_tree_add_subtree_format(mcap_tree, tvb, pos, length,
3205
0
                                  ett_docsis_tlv_mcap_dipl_down_lower_band_edge_options_list, &tlv_item,
3206
0
                                  ".82 Advanced Diplexer Downstream Lower Band Edge Options List");
3207
3208
0
                for (uint8_t i = 0; i < length; i = i + 2)
3209
0
                  {
3210
0
                    proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_tlv_mcap_adv_down_lower_band_edge_option,
3211
0
                                      tvb, pos + i, 2, ENC_BIG_ENDIAN, &tlv_value);
3212
0
                    proto_item_append_text(tlv_item, "%s %d MHz", (i == 0) ? ":" : ",", tlv_value);
3213
0
                  }
3214
0
              }
3215
0
            else
3216
0
              {
3217
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3218
0
              }
3219
0
            break;
3220
0
          case CAP_ADVANCED_DOWN_UPPER_BAND_EDGE_OPTIONS_LIST:
3221
0
            if (length > 0 && length % 2 == 0)
3222
0
              {
3223
0
                tlv_tree = proto_tree_add_subtree_format(mcap_tree, tvb, pos, length,
3224
0
                                  ett_docsis_tlv_mcap_dipl_down_upper_band_edge_options_list, &tlv_item,
3225
0
                                  ".83 Advanced Diplexer Downstream Upper Band Edge Options List");
3226
3227
0
                for (uint8_t i = 0; i < length; i = i + 2)
3228
0
                  {
3229
0
                    proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_tlv_mcap_adv_down_upper_band_edge_option,
3230
0
                                      tvb, pos + i, 2, ENC_BIG_ENDIAN, &tlv_value);
3231
0
                    proto_item_append_text(tlv_item, "%s %d MHz", (i == 0) ? ":" : ",", tlv_value);
3232
0
                  }
3233
0
              }
3234
0
            else
3235
0
              {
3236
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3237
0
              }
3238
0
            break;
3239
0
          case CAP_ADVANCED_UP_UPPER_BAND_EDGE_OPTIONS_LIST:
3240
0
            if (length > 0 && length % 2 == 0)
3241
0
              {
3242
0
                tlv_tree = proto_tree_add_subtree_format(mcap_tree, tvb, pos, length,
3243
0
                                  ett_docsis_tlv_mcap_dipl_up_upper_band_edge_options_list, &tlv_item,
3244
0
                                  ".84 Advanced Diplexer Upstream Upper Band Edge Options List");
3245
3246
0
                for (uint8_t i = 0; i < length; i = i + 2)
3247
0
                  {
3248
0
                    proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_tlv_mcap_adv_up_upper_band_edge_option,
3249
0
                                      tvb, pos + i, 2, ENC_BIG_ENDIAN, &tlv_value);
3250
0
                    proto_item_append_text(tlv_item, "%s %d MHz", (i == 0) ? ":" : ",", tlv_value);
3251
0
                  }
3252
0
              }
3253
0
            else
3254
0
              {
3255
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3256
0
              }
3257
0
            break;
3258
0
            case CAP_EXTENDED_POWER_OPTIONS:
3259
0
            if (length == 1)
3260
0
              {
3261
0
                proto_tree_add_item (mcap_tree, hf_docsis_tlv_mcap_extended_power_options, tvb,
3262
0
                                     pos, length, ENC_BIG_ENDIAN);
3263
0
              }
3264
0
            else
3265
0
              {
3266
0
                expert_add_info_format(pinfo, mcap_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3267
0
              }
3268
0
            break;
3269
0
          default:
3270
0
            dissect_unknown_tlv (tvb, pinfo, mcap_tree, pos - 2, length + 2);
3271
0
            break;
3272
0
        }                       /* switch (type) */
3273
0
      pos = pos + length;
3274
0
    }                           /* while (pos < pos+len) */
3275
0
}
3276
3277
static void
3278
dissect_cos (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, uint16_t len)
3279
0
{
3280
0
  uint8_t type, length;
3281
0
  proto_tree *cos_tree;
3282
0
  proto_tree *cos_item;
3283
0
  int pos = start;
3284
3285
0
  cos_tree =
3286
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_cos, &cos_item,
3287
0
                                  "4 Class of Service Type (Length = %u)", len);
3288
3289
0
  while (pos < (start + len))
3290
0
    {
3291
0
      type = tvb_get_uint8 (tvb, pos++);
3292
0
      length = tvb_get_uint8 (tvb, pos++);
3293
0
      switch (type)
3294
0
        {
3295
0
          case COS_CLASSID:
3296
0
            if (length == 1)
3297
0
              {
3298
0
                proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_id, tvb, pos,
3299
0
                                     length, ENC_BIG_ENDIAN);
3300
0
              }
3301
0
            else
3302
0
              {
3303
0
                expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3304
0
              }
3305
0
            break;
3306
0
          case COS_MAX_DOWN:
3307
0
            if (length == 4)
3308
0
              {
3309
0
                proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_max_down, tvb,
3310
0
                                     pos, length, ENC_BIG_ENDIAN);
3311
0
              }
3312
0
            else
3313
0
              {
3314
0
                expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3315
0
              }
3316
0
            break;
3317
0
          case COS_MAX_UP:
3318
0
            if (length == 4)
3319
0
              {
3320
0
                proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_max_up, tvb,
3321
0
                                     pos, length, ENC_BIG_ENDIAN);
3322
0
              }
3323
0
            else
3324
0
              {
3325
0
                expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3326
0
              }
3327
0
            break;
3328
0
          case COS_UP_CH_PRIO:
3329
0
            if (length == 1)
3330
0
              {
3331
0
                proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_up_chnl_pri,
3332
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
3333
0
              }
3334
0
            else
3335
0
              {
3336
0
                expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3337
0
              }
3338
0
            break;
3339
0
          case COS_MIN_UP_RATE:
3340
0
            if (length == 4)
3341
0
              {
3342
0
                proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_min_grntd_up,
3343
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
3344
0
              }
3345
0
            else
3346
0
              {
3347
0
                expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3348
0
              }
3349
0
            break;
3350
0
          case COS_MAX_UP_BURST:
3351
0
            if (length == 2)
3352
0
              {
3353
0
                proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_max_up_burst,
3354
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
3355
0
              }
3356
0
            else
3357
0
              {
3358
0
                expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3359
0
              }
3360
0
            break;
3361
0
          case COS_BP_ENABLE:
3362
0
            if (length == 1)
3363
0
              {
3364
0
                proto_tree_add_item (cos_tree, hf_docsis_tlv_cos_privacy_enable,
3365
0
                                     tvb, pos, length, ENC_BIG_ENDIAN);
3366
0
              }
3367
0
            else
3368
0
              {
3369
0
                expert_add_info_format(pinfo, cos_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3370
0
              }
3371
0
            break;
3372
0
          default:
3373
0
            dissect_unknown_tlv (tvb, pinfo, cos_tree, pos - 2, length + 2);
3374
0
            break;
3375
0
        }                       /* switch (type) */
3376
0
      pos = pos + length;
3377
0
    }                           /* while (pos < pos+len) */
3378
0
}
3379
3380
static void
3381
0
dissect_svc_unavail(tvbuff_t * tvb, proto_tree * tree, int pos, uint16_t length) {
3382
3383
0
  proto_item *svc_unavail_it;
3384
0
  proto_tree *svc_unavail_tree;
3385
0
  svc_unavail_it = proto_tree_add_item (tree,
3386
0
                                        hf_docsis_tlv_svc_unavail,
3387
0
                                        tvb, pos, length, ENC_NA);
3388
0
  svc_unavail_tree = proto_item_add_subtree(svc_unavail_it, ett_docsis_tlv_svc_unavail );
3389
0
  proto_tree_add_item (svc_unavail_tree,
3390
0
                       hf_docsis_tlv_svc_unavail_classid, tvb,
3391
0
                       pos, 1, ENC_BIG_ENDIAN);
3392
0
  proto_tree_add_item (svc_unavail_tree,
3393
0
                       hf_docsis_tlv_svc_unavail_type, tvb,
3394
0
                       pos+1, 1, ENC_BIG_ENDIAN);
3395
0
  proto_tree_add_item (svc_unavail_tree,
3396
0
                       hf_docsis_tlv_svc_unavail_code, tvb,
3397
0
                       pos+2, 1, ENC_BIG_ENDIAN);
3398
3399
0
}
3400
3401
static void
3402
0
dissect_snmpv3_kickstart(tvbuff_t * tvb, packet_info * pinfo, proto_tree *tree, int start, uint16_t len) {
3403
0
  proto_item *snmpv3_it;
3404
0
  proto_tree *snmpv3_tree;
3405
0
  uint8_t type, length;
3406
0
  int pos = start;
3407
3408
0
  snmpv3_it = proto_tree_add_item (tree,
3409
0
                                   hf_docsis_tlv_snmpv3_kick,
3410
0
                                   tvb, start, len, ENC_NA);
3411
0
  snmpv3_tree = proto_item_add_subtree(snmpv3_it, ett_docsis_tlv_snmpv3_kick);
3412
3413
0
  while (pos < (start + len))
3414
0
    {
3415
0
      type = tvb_get_uint8 (tvb, pos++);
3416
0
      length = tvb_get_uint8 (tvb, pos++);
3417
0
      switch (type)
3418
0
        {
3419
0
          case SNMPV3_SEC_NAME:
3420
0
            proto_tree_add_item (snmpv3_tree,
3421
0
                                 hf_docsis_tlv_snmpv3_kick_name, tvb,
3422
0
                                 pos, length, ENC_ASCII);
3423
0
            break;
3424
0
          case SNMPV3_MGR_PUB_NUM:
3425
0
            proto_tree_add_item (snmpv3_tree,
3426
0
                                 hf_docsis_tlv_snmpv3_kick_publicnum, tvb,
3427
0
                                 pos, length, ENC_NA);
3428
0
            break;
3429
0
          default:
3430
0
            dissect_unknown_tlv (tvb, pinfo, snmpv3_tree, pos - 2, length + 2);
3431
0
            break;
3432
0
        }  /* switch */
3433
0
      pos += length;
3434
0
    }   /* while */
3435
0
}
3436
3437
static void
3438
dissect_ds_ch_list_single (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree,
3439
                           int start, uint16_t len)
3440
0
{
3441
0
  uint8_t type, length;
3442
0
  proto_tree *single_tree;
3443
0
  proto_item *single_item;
3444
0
  int pos = start;
3445
3446
0
  single_tree =
3447
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ds_ch_list_single, &single_item,
3448
0
                                  "1 Single Downstream Channel (Length = %u)", len);
3449
3450
0
  while (pos < (start + len))
3451
0
    {
3452
0
      type = tvb_get_uint8 (tvb, pos++);
3453
0
      length = tvb_get_uint8 (tvb, pos++);
3454
0
      switch (type)
3455
0
        {
3456
0
          case SINGLE_CH_TIMEOUT:
3457
0
            if (length == 2)
3458
0
              {
3459
0
                proto_tree_add_item (single_tree, hf_docsis_tlv_single_ch_timeout, tvb,
3460
0
                                     pos, length, ENC_BIG_ENDIAN);
3461
0
              }
3462
0
            else
3463
0
              {
3464
0
                expert_add_info_format(pinfo, single_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3465
0
              }
3466
0
            break;
3467
0
          case SINGLE_CH_FREQ:
3468
0
            if (length == 4)
3469
0
              {
3470
0
                proto_tree_add_item (single_tree, hf_docsis_tlv_single_ch_freq, tvb,
3471
0
                                     pos, length, ENC_BIG_ENDIAN);
3472
0
              }
3473
0
            else
3474
0
              {
3475
0
                expert_add_info_format(pinfo, single_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3476
0
              }
3477
0
            break;
3478
0
          default:
3479
0
            dissect_unknown_tlv (tvb, pinfo, single_tree, pos - 2, length + 2);
3480
0
            break;
3481
0
        }  /* switch */
3482
0
      pos = pos + length;
3483
0
    }                           /* while */
3484
0
}
3485
3486
static void
3487
dissect_ds_ch_list_range (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree,
3488
                          int start, uint16_t len)
3489
0
{
3490
0
  uint8_t type, length;
3491
0
  proto_tree *range_tree;
3492
0
  proto_item *range_item;
3493
0
  int pos = start;
3494
3495
0
  range_tree =
3496
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ds_ch_list_range, &range_item,
3497
0
                                  "2 Downstream Frequency Range (Length = %u)", len);
3498
3499
0
  while (pos < (start + len))
3500
0
    {
3501
0
      type = tvb_get_uint8 (tvb, pos++);
3502
0
      length = tvb_get_uint8 (tvb, pos++);
3503
0
      switch (type)
3504
0
        {
3505
0
          case FREQ_RNG_TIMEOUT:
3506
0
            if (length == 2)
3507
0
              {
3508
0
                proto_tree_add_item (range_tree, hf_docsis_tlv_freq_rng_timeout, tvb,
3509
0
                                     pos, length, ENC_BIG_ENDIAN);
3510
0
              }
3511
0
            else
3512
0
              {
3513
0
                expert_add_info_format(pinfo, range_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3514
0
              }
3515
0
            break;
3516
0
          case FREQ_RNG_START:
3517
0
            if (length == 4)
3518
0
              {
3519
0
                proto_tree_add_item (range_tree, hf_docsis_tlv_freq_rng_start, tvb,
3520
0
                                     pos, length, ENC_BIG_ENDIAN);
3521
0
              }
3522
0
            else
3523
0
              {
3524
0
                expert_add_info_format(pinfo, range_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3525
0
              }
3526
0
            break;
3527
0
          case FREQ_RNG_END:
3528
0
            if (length == 4)
3529
0
              {
3530
0
                proto_tree_add_item (range_tree, hf_docsis_tlv_freq_rng_end, tvb,
3531
0
                                     pos, length, ENC_BIG_ENDIAN);
3532
0
              }
3533
0
            else
3534
0
              {
3535
0
                expert_add_info_format(pinfo, range_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3536
0
              }
3537
0
            break;
3538
0
          case FREQ_RNG_STEP:
3539
0
            if (length == 4)
3540
0
              {
3541
0
                proto_tree_add_item (range_tree, hf_docsis_tlv_freq_rng_step, tvb,
3542
0
                                     pos, length, ENC_BIG_ENDIAN);
3543
0
              }
3544
0
            else
3545
0
              {
3546
0
                expert_add_info_format(pinfo, range_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3547
0
              }
3548
0
            break;
3549
0
          default:
3550
0
            dissect_unknown_tlv (tvb, pinfo, range_tree, pos - 2, length + 2);
3551
0
            break;
3552
0
        }                           /* switch */
3553
0
      pos = pos + length;
3554
0
    }                             /* while */
3555
0
}
3556
3557
static void
3558
dissect_dut_filter (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree,
3559
                    int start, uint16_t len)
3560
0
{
3561
0
  uint8_t type, length;
3562
0
  proto_tree *dut_tree;
3563
0
  proto_item *dut_item;
3564
0
  int pos = start;
3565
3566
0
  dut_tree =
3567
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dut_filter, &dut_item,
3568
0
                                  "45 Downstream Unencrypted Traffic (Length = %u)", len);
3569
3570
0
  while (pos < (start + len))
3571
0
    {
3572
0
      type = tvb_get_uint8 (tvb, pos++);
3573
0
      length = tvb_get_uint8 (tvb, pos++);
3574
0
      switch (type)
3575
0
        {
3576
0
          case DUT_CONTROL:
3577
0
            if (length == 1)
3578
0
              {
3579
0
                proto_tree_add_item (dut_tree, hf_docsis_tlv_dut_filter_control, tvb,
3580
0
                                     pos, length, ENC_BIG_ENDIAN);
3581
0
              }
3582
0
            else
3583
0
              {
3584
0
                expert_add_info_format(pinfo, dut_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3585
0
              }
3586
0
            break;
3587
0
          case DUT_CMIM:
3588
0
            proto_tree_add_item (dut_tree, hf_docsis_tlv_dut_filter_cmim, tvb,
3589
0
                                 pos, length, ENC_NA);
3590
0
            break;
3591
0
          default:
3592
0
            dissect_unknown_tlv (tvb, pinfo, dut_tree, pos - 2, length + 2);
3593
0
            break;
3594
0
        }                       /* switch */
3595
0
      pos = pos + length;
3596
0
    }                           /* while */
3597
0
}
3598
3599
static void
3600
dissect_ds_ch_list(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
3601
0
{
3602
0
  uint8_t type, length;
3603
0
  proto_tree *dschlst_tree;
3604
0
  proto_item *dschlst_item;
3605
0
  int pos = start;
3606
3607
0
  dschlst_tree =
3608
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ds_ch_list, &dschlst_item,
3609
0
                                  "41 Downstream Channel List (Length = %u)", len);
3610
3611
0
  while (pos < (start + len))
3612
0
    {
3613
0
      type = tvb_get_uint8 (tvb, pos++);
3614
0
      length = tvb_get_uint8 (tvb, pos++);
3615
0
      switch (type)
3616
0
        {
3617
0
          case DS_CH_LIST_SINGLE:
3618
0
            dissect_ds_ch_list_single(tvb, pinfo, dschlst_tree, pos, length);
3619
0
            break;
3620
0
          case DS_CH_LIST_RANGE:
3621
0
            dissect_ds_ch_list_range(tvb, pinfo, dschlst_tree, pos, length);
3622
0
            break;
3623
0
          case DS_CH_LIST_DEFAULT_TIMEOUT:
3624
0
            if (length == 2)
3625
0
              {
3626
0
                proto_tree_add_item (dschlst_tree,
3627
0
                                     hf_docsis_tlv_ds_ch_list_default_timeout, tvb, pos,
3628
0
                                     length, ENC_BIG_ENDIAN);
3629
0
              }
3630
0
            else
3631
0
              {
3632
0
                expert_add_info_format(pinfo, dschlst_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3633
0
              }
3634
0
            break;
3635
0
          default:
3636
0
            dissect_unknown_tlv (tvb, pinfo, dschlst_tree, pos - 2, length + 2);
3637
0
            break;
3638
0
        }                       /* switch */
3639
0
      pos = pos + length;
3640
0
    }                           /* while */
3641
0
}
3642
3643
static void
3644
dissect_docsis_extension_field(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
3645
0
{
3646
0
  proto_tree *ext_field_tree;
3647
0
  proto_item *ext_field_item;
3648
0
  tvbuff_t *vsif_tvb;
3649
3650
0
  ext_field_tree =
3651
0
  proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ext_field, &ext_field_item,
3652
0
                                  "43 DOCSIS Extension Field (Length = %u)", len);
3653
3654
0
  vsif_tvb = tvb_new_subset_length (tvb, start, len);
3655
0
  call_dissector (docsis_vsif_handle, vsif_tvb, pinfo, ext_field_tree);
3656
0
}
3657
3658
static void
3659
dissect_vendor_specific_capabilities(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
3660
0
{
3661
0
  proto_tree *vend_spec_cap_tree;
3662
0
  proto_item *vend_spec_cap_item;
3663
0
  tvbuff_t *vsif_tvb;
3664
3665
0
  vend_spec_cap_tree =
3666
0
  proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_vendor_specific_cap, &vend_spec_cap_item,
3667
0
                                  "44 Vendor Specific Capabilities (Length = %u)", len);
3668
3669
0
  vsif_tvb = tvb_new_subset_length (tvb, start, len);
3670
0
  call_dissector (docsis_vsif_handle, vsif_tvb, pinfo, vend_spec_cap_tree);
3671
0
}
3672
3673
static void
3674
dissect_tcc_err(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
3675
0
{
3676
0
  uint8_t type, length;
3677
0
  proto_tree *tccerr_tree;
3678
0
  proto_tree *tccerr_item;
3679
0
  int pos = start;
3680
3681
0
  tccerr_tree =
3682
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tcc_err, &tccerr_item,
3683
0
                                  "TCC Error Encodings (Length = %u)", len);
3684
3685
0
  while (pos < (start + len))
3686
0
    {
3687
0
      type = tvb_get_uint8 (tvb, pos++);
3688
0
      length = tvb_get_uint8 (tvb, pos++);
3689
0
      switch (type)
3690
0
        {
3691
0
          case TCC_ERR_SUBTYPE:
3692
0
            proto_tree_add_item (tccerr_tree,
3693
0
                                 hf_docsis_tcc_err_subtype, tvb,
3694
0
                                 pos, length, ENC_NA);
3695
0
            break;
3696
0
          case TCC_ERR_CODE:
3697
0
            if (length == 1)
3698
0
              {
3699
0
                proto_tree_add_item (tccerr_tree,
3700
0
                                     hf_docsis_tcc_err_code, tvb, pos,
3701
0
                                     length, ENC_BIG_ENDIAN);
3702
0
              }
3703
0
            else
3704
0
              {
3705
0
                expert_add_info_format(pinfo, tccerr_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3706
0
              }
3707
0
            break;
3708
0
          case TCC_ERR_MSG:
3709
0
            proto_tree_add_item (tccerr_tree,
3710
0
                                 hf_docsis_tcc_err_msg, tvb,
3711
0
                                 pos, length, ENC_ASCII);
3712
0
            break;
3713
0
          default:
3714
0
            dissect_unknown_tlv (tvb, pinfo, tccerr_tree, pos - 2, length + 2);
3715
0
            break;
3716
0
        }                       /* switch */
3717
0
      pos = pos + length;
3718
0
    }                           /* while */
3719
0
}
3720
3721
static void
3722
dissect_tcc_rng_parms(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
3723
0
{
3724
0
  uint8_t type, length;
3725
0
  proto_tree *rngparm_tree;
3726
0
  proto_item *rngparm_item;
3727
0
  int pos = start;
3728
3729
0
  rngparm_tree =
3730
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tcc_rng_parms, &rngparm_item,
3731
0
                                  ".8 Ranging Parameters (Length = %u)", len);
3732
3733
0
  while (pos < (start + len))
3734
0
    {
3735
0
      type = tvb_get_uint8 (tvb, pos++);
3736
0
      length = tvb_get_uint8 (tvb, pos++);
3737
0
      switch (type)
3738
0
        {
3739
0
          case RNG_PARMS_US_CH_ID:
3740
0
            if (length == 1)
3741
0
              {
3742
0
                proto_tree_add_item (rngparm_tree,
3743
0
                                     hf_docsis_rng_parms_us_ch_id, tvb, pos,
3744
0
                                     length, ENC_BIG_ENDIAN);
3745
0
              }
3746
0
            else
3747
0
              {
3748
0
                expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3749
0
              }
3750
0
            break;
3751
0
          case RNG_PARMS_TIME_OFF_INT:
3752
0
            if (length == 4)
3753
0
              {
3754
0
                proto_tree_add_item (rngparm_tree,
3755
0
                                     hf_docsis_rng_parms_time_off_int, tvb, pos,
3756
0
                                     length, ENC_BIG_ENDIAN);
3757
0
              }
3758
0
            else
3759
0
              {
3760
0
                expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3761
0
              }
3762
0
            break;
3763
0
          case RNG_PARMS_TIME_OFF_FRAC:
3764
0
            if (length == 1)
3765
0
              {
3766
0
                proto_tree_add_item (rngparm_tree,
3767
0
                                     hf_docsis_rng_parms_time_off_frac, tvb, pos,
3768
0
                                     length, ENC_BIG_ENDIAN);
3769
0
              }
3770
0
            else
3771
0
              {
3772
0
                expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3773
0
              }
3774
0
            break;
3775
0
          case RNG_PARMS_POWER_OFF:
3776
0
            if (length == 1)
3777
0
              {
3778
0
                proto_tree_add_item (rngparm_tree,
3779
0
                                     hf_docsis_rng_parms_power_off, tvb, pos,
3780
0
                                     length, ENC_BIG_ENDIAN);
3781
0
              }
3782
0
            else
3783
0
              {
3784
0
                expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3785
0
              }
3786
0
            break;
3787
0
          case RNG_PARMS_FREQ_OFF:
3788
0
            if (length == 1)
3789
0
              {
3790
0
                proto_tree_add_item (rngparm_tree,
3791
0
                                     hf_docsis_rng_parms_freq_off, tvb, pos,
3792
0
                                     length, ENC_BIG_ENDIAN);
3793
0
              }
3794
0
            else
3795
0
              {
3796
0
                expert_add_info_format(pinfo, rngparm_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3797
0
              }
3798
0
            break;
3799
0
          default:
3800
0
            dissect_unknown_tlv (tvb, pinfo, rngparm_tree, pos - 2, length + 2);
3801
0
            break;
3802
0
        }                       /* switch */
3803
0
      pos = pos + length;
3804
0
    }                           /* while */
3805
0
}
3806
3807
static void
3808
dissect_tcc_oudp(tvbuff_t * tvb, proto_tree *tree, int start, uint16_t len)
3809
0
{
3810
0
  proto_tree *oudp_tree;
3811
0
  proto_item *oudp_item;
3812
0
  int pos = start;
3813
3814
0
  oudp_tree =
3815
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tcc_oudp, &oudp_item,
3816
0
                                  ".11 Assigned OFDMA Upstream Data Profile (OUDP) IUC (Length = %u)", len);
3817
3818
0
  while (pos < (start + len))
3819
0
    {
3820
0
      proto_tree_add_item (oudp_tree, hf_docsis_tlv_tcc_oudp_iuc, tvb, pos, 1, ENC_BIG_ENDIAN);
3821
0
      ++pos;
3822
0
    }
3823
0
}
3824
3825
static void
3826
dissect_sid_cl_so_crit(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
3827
0
{
3828
0
  uint8_t type, length;
3829
0
  proto_tree *crit_tree;
3830
0
  proto_item *crit_item;
3831
0
  int pos = start;
3832
3833
0
  crit_tree =
3834
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sid_cl_so, &crit_item,
3835
0
                                  ".3 SID Cluster Switchover Criteria (Length = %u)", len);
3836
3837
0
  while (pos < (start + len))
3838
0
    {
3839
0
      type = tvb_get_uint8 (tvb, pos++);
3840
0
      length = tvb_get_uint8 (tvb, pos++);
3841
0
      switch (type)
3842
0
        {
3843
0
          case SID_CL_SO_MAX_REQ:
3844
0
            if (length == 1)
3845
0
              {
3846
0
                proto_tree_add_item (crit_tree,
3847
0
                                     hf_docsis_sid_cl_so_max_req, tvb, pos,
3848
0
                                     length, ENC_BIG_ENDIAN);
3849
0
              }
3850
0
            else
3851
0
              {
3852
0
                expert_add_info_format(pinfo, crit_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3853
0
              }
3854
0
            break;
3855
0
          case SID_CL_SO_MAX_OUT_BYTES:
3856
0
            if (length == 4)
3857
0
              {
3858
0
                proto_tree_add_item (crit_tree,
3859
0
                                     hf_docsis_sid_cl_so_max_out_bytes, tvb, pos,
3860
0
                                     length, ENC_BIG_ENDIAN);
3861
0
              }
3862
0
            else
3863
0
              {
3864
0
                expert_add_info_format(pinfo, crit_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3865
0
              }
3866
0
            break;
3867
0
          case SID_CL_SO_MAX_REQ_BYTES:
3868
0
            if (length == 4)
3869
0
              {
3870
0
                proto_tree_add_item (crit_tree,
3871
0
                                     hf_docsis_sid_cl_so_max_req_bytes, tvb, pos,
3872
0
                                     length, ENC_BIG_ENDIAN);
3873
0
              }
3874
0
            else
3875
0
              {
3876
0
                expert_add_info_format(pinfo, crit_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3877
0
              }
3878
0
            break;
3879
0
          case SID_CL_SO_MAX_TIME:
3880
0
            if (length == 2)
3881
0
              {
3882
0
                proto_tree_add_item (crit_tree,
3883
0
                                     hf_docsis_sid_cl_so_max_time, tvb, pos,
3884
0
                                     length, ENC_BIG_ENDIAN);
3885
0
              }
3886
0
            else
3887
0
              {
3888
0
                expert_add_info_format(pinfo, crit_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3889
0
              }
3890
0
            break;
3891
0
          default:
3892
0
            dissect_unknown_tlv (tvb, pinfo, crit_tree, pos - 2, length + 2);
3893
0
            break;
3894
0
        }                       /* switch */
3895
0
      pos = pos + length;
3896
0
    }                           /* while */
3897
0
}
3898
3899
static void
3900
dissect_sid_cl_enc_map(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
3901
0
{
3902
0
  uint8_t type, length;
3903
0
  proto_tree *map_tree;
3904
0
  proto_item *map_item;
3905
0
  int pos = start;
3906
3907
0
  map_tree =
3908
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sid_cl_enc_map, &map_item,
3909
0
                                  "..2 SID-to-Channel Mapping (Length = %u)", len);
3910
3911
0
  while (pos < (start + len))
3912
0
    {
3913
0
      type = tvb_get_uint8 (tvb, pos++);
3914
0
      length = tvb_get_uint8 (tvb, pos++);
3915
0
      switch (type)
3916
0
        {
3917
0
          case SID_CL_MAP_US_CH_ID:
3918
0
            if (length == 1)
3919
0
              {
3920
0
                proto_tree_add_item (map_tree,
3921
0
                                     hf_docsis_sid_cl_map_us_ch_id, tvb, pos,
3922
0
                                     length, ENC_BIG_ENDIAN);
3923
0
              }
3924
0
            else
3925
0
              {
3926
0
                expert_add_info_format(pinfo, map_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3927
0
              }
3928
0
            break;
3929
0
          case SID_CL_MAP_SID:
3930
0
            if (length == 2)
3931
0
              {
3932
0
                proto_tree_add_item (map_tree,
3933
0
                                     hf_docsis_sid_cl_map_sid, tvb, pos,
3934
0
                                     length, ENC_BIG_ENDIAN);
3935
0
              }
3936
0
            else
3937
0
              {
3938
0
                expert_add_info_format(pinfo, map_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3939
0
              }
3940
0
            break;
3941
0
          case SID_CL_MAP_ACTION:
3942
0
            if (length == 1)
3943
0
              {
3944
0
                proto_tree_add_item (map_tree,
3945
0
                                     hf_docsis_sid_cl_map_action, tvb, pos,
3946
0
                                     length, ENC_BIG_ENDIAN);
3947
0
              }
3948
0
            else
3949
0
              {
3950
0
                expert_add_info_format(pinfo, map_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3951
0
              }
3952
0
            break;
3953
0
          default:
3954
0
            dissect_unknown_tlv (tvb, pinfo, map_tree, pos - 2, length + 2);
3955
0
            break;
3956
0
        }                       /* switch */
3957
0
      pos = pos + length;
3958
0
    }                           /* while */
3959
0
}
3960
3961
static void
3962
dissect_sid_cl_enc(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
3963
0
{
3964
0
  uint8_t type, length;
3965
0
  proto_tree *enc_tree;
3966
0
  proto_item *enc_item;
3967
0
  int pos = start;
3968
3969
0
  enc_tree =
3970
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sid_cl_enc, &enc_item,
3971
0
                                  ".2 SID Cluster Encoding (Length = %u)", len);
3972
3973
0
  while (pos < (start + len))
3974
0
    {
3975
0
      type = tvb_get_uint8 (tvb, pos++);
3976
0
      length = tvb_get_uint8 (tvb, pos++);
3977
0
      switch (type)
3978
0
        {
3979
0
          case SID_CL_ENC_ID:
3980
0
            if (length == 1)
3981
0
              {
3982
0
                proto_tree_add_item (enc_tree,
3983
0
                                     hf_docsis_sid_cl_enc_id, tvb, pos,
3984
0
                                     length, ENC_BIG_ENDIAN);
3985
0
              }
3986
0
            else
3987
0
              {
3988
0
                expert_add_info_format(pinfo, enc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3989
0
              }
3990
0
            break;
3991
0
          case SID_CL_ENC_MAP:
3992
0
            if (length == 10)
3993
0
              dissect_sid_cl_enc_map(tvb, pinfo, enc_tree, pos, length);
3994
0
            else
3995
0
              expert_add_info_format(pinfo, enc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
3996
0
            break;
3997
0
          default:
3998
0
            dissect_unknown_tlv (tvb, pinfo, enc_tree, pos - 2, length + 2);
3999
0
            break;
4000
0
        }                       /* switch */
4001
0
      pos = pos + length;
4002
0
    }                           /* while */
4003
0
}
4004
4005
static void
4006
dissect_sid_cl(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4007
0
{
4008
0
  uint8_t type, length;
4009
0
  proto_tree *sid_tree;
4010
0
  proto_item *sid_item;
4011
0
  int pos = start;
4012
4013
0
  sid_tree =
4014
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_sid_cl, &sid_item,
4015
0
                                  "47 Service Flow SID Cluster Assignments (Length = %u)", len);
4016
4017
0
  while (pos < (start + len))
4018
0
    {
4019
0
      type = tvb_get_uint8 (tvb, pos++);
4020
0
      length = tvb_get_uint8 (tvb, pos++);
4021
0
      switch (type)
4022
0
        {
4023
0
          case SID_CL_SF_ID:
4024
0
            if (length == 4)
4025
0
              {
4026
0
                proto_tree_add_item (sid_tree,
4027
0
                                     hf_docsis_sid_cl_sf_id, tvb, pos,
4028
0
                                     length, ENC_BIG_ENDIAN);
4029
0
              }
4030
0
            else
4031
0
              {
4032
0
                expert_add_info_format(pinfo, sid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4033
0
              }
4034
0
            break;
4035
0
          case SID_CL_ENC:
4036
0
            dissect_sid_cl_enc(tvb, pinfo, sid_tree, pos, length);
4037
0
            break;
4038
0
          case SID_CL_SO_CRIT:
4039
0
            dissect_sid_cl_so_crit(tvb, pinfo, sid_tree, pos, length);
4040
0
            break;
4041
0
          default:
4042
0
            dissect_unknown_tlv (tvb, pinfo, sid_tree, pos - 2, length + 2);
4043
0
            break;
4044
0
        }                       /* switch */
4045
0
      pos = pos + length;
4046
0
    }                           /* while */
4047
0
}
4048
4049
static void
4050
dissect_tcc(tvbuff_t * tvb, packet_info * pinfo,
4051
            proto_tree *tree, int start, uint16_t len, int* previous_channel_id)
4052
0
{
4053
0
  uint8_t type, length;
4054
0
  proto_tree *tcc_tree, *reassembled_ucd_tree;
4055
0
  proto_item *tcc_item, *reassembled_ucd_item;
4056
0
  int pos = start;
4057
0
  int channel_id = -1;
4058
4059
0
  fragment_head* reassembled_ucd = NULL;
4060
4061
0
  tcc_tree =
4062
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tcc, &tcc_item,
4063
0
                                  "46 Transmit Channel Configuration (Length = %u)", len);
4064
4065
0
  while (pos < (start + len))
4066
0
    {
4067
0
      type = tvb_get_uint8 (tvb, pos++);
4068
0
      length = tvb_get_uint8 (tvb, pos++);
4069
0
      switch (type)
4070
0
        {
4071
0
          case TLV_TCC_REFID:
4072
0
            if (length == 1)
4073
0
              {
4074
0
                proto_tree_add_item (tcc_tree,
4075
0
                                     hf_docsis_tlv_tcc_refid, tvb, pos,
4076
0
                                     length, ENC_BIG_ENDIAN);
4077
0
              }
4078
0
            else
4079
0
              {
4080
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4081
0
              }
4082
0
            break;
4083
0
          case TLV_TCC_US_CH_ACTION:
4084
0
            if (length == 1)
4085
0
              {
4086
0
                proto_tree_add_item (tcc_tree,
4087
0
                                     hf_docsis_tlv_tcc_us_ch_action, tvb, pos,
4088
0
                                     length, ENC_BIG_ENDIAN);
4089
0
              }
4090
0
            else
4091
0
              {
4092
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4093
0
              }
4094
0
            break;
4095
0
          case TLV_TCC_US_CH_ID:
4096
0
            if (length == 1)
4097
0
              {
4098
0
                proto_tree_add_item_ret_uint (tcc_tree,
4099
0
                                     hf_docsis_tlv_tcc_us_ch_id, tvb, pos,
4100
0
                                     length, ENC_BIG_ENDIAN, (uint32_t*)&channel_id);
4101
                /* Only perform reassembly on UCD if TLV is reassembled. fragment_end_seq_next added for the rare cases where UCD end is 254 long. */
4102
0
                if(!pinfo->fragmented && *previous_channel_id != -1) {
4103
0
                  fragment_end_seq_next(&ucd_reassembly_table, pinfo, *previous_channel_id, NULL);
4104
0
                }
4105
0
                *previous_channel_id = channel_id;
4106
4107
0
              }
4108
0
            else
4109
0
              {
4110
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4111
0
              }
4112
0
            break;
4113
0
          case TLV_TCC_NEW_US_CH_ID:
4114
0
            if (length == 1)
4115
0
              {
4116
0
                proto_tree_add_item (tcc_tree,
4117
0
                                     hf_docsis_tlv_tcc_new_us_ch_id, tvb, pos,
4118
0
                                     length, ENC_BIG_ENDIAN);
4119
0
              }
4120
0
            else
4121
0
              {
4122
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4123
0
              }
4124
0
            break;
4125
0
          case TLV_TCC_UCD:
4126
0
            proto_tree_add_item (tcc_tree, hf_docsis_tlv_tcc_ucd, tvb, pos, length, ENC_NA);
4127
0
            if (channel_id == -1) {
4128
0
              channel_id = *previous_channel_id;
4129
0
            }
4130
4131
            /* Only perform reassembly on UCD if TLV is reassembled */
4132
0
            if(!pinfo->fragmented) {
4133
0
              reassembled_ucd_item = proto_tree_add_item(tcc_tree, hf_docsis_ucd_reassembled, tvb, 0, -1, ENC_NA);
4134
0
              reassembled_ucd_tree = proto_item_add_subtree (reassembled_ucd_item, ett_docsis_ucd_reassembled );
4135
4136
0
              reassembled_ucd = fragment_add_seq_next(&ucd_reassembly_table,
4137
0
                                  tvb, pos, pinfo,
4138
0
                                  channel_id, NULL, /* ID for fragments belonging together */
4139
0
                                  length, /* fragment length - to the end */
4140
0
                                  (len == 254)); /* More fragments? */
4141
4142
0
              if (reassembled_ucd) {
4143
0
                tvbuff_t *ucd_tvb = NULL;
4144
0
                ucd_tvb = process_reassembled_data(tvb, pos , pinfo, ".5 Reassembled UCD", reassembled_ucd, &ucd_frag_items,
4145
0
                                                NULL, reassembled_ucd_tree);
4146
4147
0
                if (ucd_tvb && tvb_reported_length(ucd_tvb) > 0) {
4148
0
                  call_dissector (docsis_ucd_handle, ucd_tvb, pinfo, reassembled_ucd_tree);
4149
0
                }
4150
0
              }
4151
0
            }
4152
4153
0
            break;
4154
0
          case TLV_TCC_RNG_SID:
4155
0
            if (length == 2)
4156
0
              {
4157
0
                proto_tree_add_item (tcc_tree,
4158
0
                                     hf_docsis_tlv_tcc_rng_sid, tvb, pos,
4159
0
                                     length, ENC_BIG_ENDIAN);
4160
0
              }
4161
0
            else
4162
0
              {
4163
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4164
0
              }
4165
0
            break;
4166
0
          case TLV_TCC_INIT_TECH:
4167
0
            if (length == 1)
4168
0
              {
4169
0
                proto_tree_add_item (tcc_tree,
4170
0
                                     hf_docsis_tlv_tcc_init_tech, tvb, pos,
4171
0
                                     length, ENC_BIG_ENDIAN);
4172
0
              }
4173
0
            else
4174
0
              {
4175
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4176
0
              }
4177
0
            break;
4178
0
          case TLV_TCC_RNG_PARMS:
4179
0
            dissect_tcc_rng_parms(tvb, pinfo, tcc_tree, pos, length);
4180
0
            break;
4181
0
          case TLV_TCC_DYN_RNG_WIN:
4182
0
            if (length == 1)
4183
0
              {
4184
0
                proto_tree_add_item (tcc_tree,
4185
0
                                     hf_docsis_tlv_tcc_dyn_rng_win, tvb, pos,
4186
0
                                     length, ENC_BIG_ENDIAN);
4187
0
              }
4188
0
            else
4189
0
              {
4190
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4191
0
              }
4192
0
            break;
4193
0
          case TLV_TCC_P1_6HI:
4194
0
            if (length == 1)
4195
0
              {
4196
0
                proto_tree_add_item (tcc_tree,
4197
0
                                     hf_docsis_tlv_tcc_p_16hi, tvb, pos,
4198
0
                                     length, ENC_BIG_ENDIAN);
4199
0
              }
4200
0
            else
4201
0
              {
4202
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4203
0
              }
4204
0
            break;
4205
0
          case TLV_TCC_ASSIGN_OFDMA_UP_DATA_PROF:
4206
0
            dissect_tcc_oudp(tvb, tcc_tree, pos, length);
4207
0
            break;
4208
0
          case TLV_TCC_EXTENDED_DRW:
4209
0
            if (length == 1)
4210
0
              {
4211
0
                proto_tree_add_item (tcc_tree,
4212
0
                                     hf_docsis_tlv_tcc_extended_drw, tvb, pos,
4213
0
                                     length, ENC_BIG_ENDIAN);
4214
0
              }
4215
0
            else
4216
0
              {
4217
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4218
0
              }
4219
0
            break;
4220
0
          case TLV_TCC_EXTENDED_US_RNG_PWR:
4221
0
            if (length == 2)
4222
0
              {
4223
0
                proto_tree_add_item (tcc_tree,
4224
0
                                     hf_docsis_tlv_tcc_extended_us_rng_pwr, tvb, pos,
4225
0
                                     length, ENC_BIG_ENDIAN);
4226
0
              }
4227
0
            else
4228
0
              {
4229
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4230
0
              }
4231
0
            break;
4232
0
          case TLV_TCC_OUDP_SOUNDING_SID:
4233
0
            if (length == 2)
4234
0
              {
4235
0
                proto_tree_add_item (tcc_tree,
4236
0
                                     hf_docsis_tlv_tcc_oudp_sounding_sid, tvb, pos,
4237
0
                                     length, ENC_BIG_ENDIAN);
4238
0
              }
4239
0
            else
4240
0
              {
4241
0
                expert_add_info_format(pinfo, tcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4242
0
              }
4243
0
            break;
4244
0
          case TLV_TCC_ERR:
4245
0
            dissect_tcc_err(tvb, pinfo, tcc_tree, pos, length);
4246
0
            break;
4247
0
          default:
4248
0
            dissect_unknown_tlv (tvb, pinfo, tcc_tree, pos - 2, length + 2);
4249
0
            break;
4250
0
        }                       /* switch */
4251
0
      pos = pos + length;
4252
0
    }                           /* while */
4253
0
}
4254
4255
static void
4256
dissect_ch_bl_rng(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4257
0
{
4258
0
  uint8_t type, length;
4259
0
  proto_tree *chblrng_tree;
4260
0
  proto_item *chblrng_item;
4261
0
  int pos = start;
4262
4263
0
  chblrng_tree =
4264
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcp_ch_bl_rng, &chblrng_item,
4265
0
                                  "..3 Receive Module Channel Block Range (Length = %u)", len);
4266
4267
0
  while (pos < (start + len))
4268
0
    {
4269
0
      type = tvb_get_uint8 (tvb, pos++);
4270
0
      length = tvb_get_uint8 (tvb, pos++);
4271
0
      switch (type)
4272
0
        {
4273
0
          case CH_BL_RNG_MIN_CTR_FREQ:
4274
0
            if (length == 4)
4275
0
              {
4276
0
                proto_tree_add_item (chblrng_tree,
4277
0
                                     hf_docsis_ch_bl_rng_min_ctr_freq, tvb, pos,
4278
0
                                     length, ENC_BIG_ENDIAN);
4279
0
              }
4280
0
            else
4281
0
              {
4282
0
                expert_add_info_format(pinfo, chblrng_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4283
0
              }
4284
0
            break;
4285
0
          case CH_BL_RNG_MAX_CTR_FREQ:
4286
0
            if (length == 4)
4287
0
              {
4288
0
                proto_tree_add_item (chblrng_tree,
4289
0
                                     hf_docsis_ch_bl_rng_max_ctr_freq, tvb, pos,
4290
0
                                     length, ENC_BIG_ENDIAN);
4291
0
              }
4292
0
            else
4293
0
              {
4294
0
                expert_add_info_format(pinfo, chblrng_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4295
0
              }
4296
0
            break;
4297
0
          default:
4298
0
            dissect_unknown_tlv (tvb, pinfo, chblrng_tree, pos - 2, length + 2);
4299
0
            break;
4300
0
        }                       /* switch */
4301
0
      pos = pos + length;
4302
0
    }                           /* while */
4303
0
}
4304
4305
static void
4306
dissect_rcp_rcv_mod(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4307
0
{
4308
0
  uint8_t type, length;
4309
0
  proto_tree *rcvmod_tree;
4310
0
  proto_item *rcvmod_item;
4311
0
  int pos = start;
4312
4313
0
  rcvmod_tree =
4314
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcp_rcv_mod_enc, &rcvmod_item,
4315
0
                                  ".4 Receive Module Capability (Length = %u)", len);
4316
4317
0
  while (pos < (start + len))
4318
0
    {
4319
0
      type = tvb_get_uint8 (tvb, pos++);
4320
0
      length = tvb_get_uint8 (tvb, pos++);
4321
0
      switch (type)
4322
0
        {
4323
0
          case RCV_MOD_ENC_IDX:
4324
0
            if (length == 1)
4325
0
              {
4326
0
                proto_tree_add_item (rcvmod_tree,
4327
0
                                     hf_docsis_rcv_mod_enc_idx, tvb, pos,
4328
0
                                     length, ENC_BIG_ENDIAN);
4329
0
              }
4330
0
            else
4331
0
              {
4332
0
                expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4333
0
              }
4334
0
            break;
4335
0
          case RCV_MOD_ENC_ADJ_CH:
4336
0
            if (length == 1)
4337
0
              {
4338
0
                proto_tree_add_item (rcvmod_tree,
4339
0
                                     hf_docsis_rcv_mod_enc_adj_ch, tvb, pos,
4340
0
                                     length, ENC_BIG_ENDIAN);
4341
0
              }
4342
0
            else
4343
0
              {
4344
0
                expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4345
0
              }
4346
0
            break;
4347
0
          case RCV_MOD_ENC_CH_BL_RNG:
4348
0
            dissect_ch_bl_rng(tvb, pinfo, rcvmod_tree, pos, length);
4349
0
            break;
4350
0
          case RCV_MOD_ENC_CTR_FREQ_ASGN:
4351
0
            if (length == 4)
4352
0
              {
4353
0
                proto_tree_add_item (rcvmod_tree,
4354
0
                                     hf_docsis_rcv_mod_enc_ctr_freq_asgn, tvb, pos,
4355
0
                                     length, ENC_BIG_ENDIAN);
4356
0
              }
4357
0
            else
4358
0
              {
4359
0
                expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4360
0
              }
4361
0
            break;
4362
0
          case RCV_MOD_ENC_RSQ_CH_SUBS_CAP:
4363
0
            proto_tree_add_item (rcvmod_tree,
4364
0
                                 hf_docsis_rcv_mod_enc_rsq_ch_subs_cap, tvb, pos,
4365
0
                                 length, ENC_NA);
4366
0
            break;
4367
0
          case RCV_MOD_ENC_CONN:
4368
0
            proto_tree_add_item (rcvmod_tree,
4369
0
                                 hf_docsis_rcv_mod_enc_conn, tvb, pos,
4370
0
                                 length, ENC_NA);
4371
0
            break;
4372
0
          case RCV_MOD_ENC_PHY_LAYR_PARMS:
4373
0
            proto_tree_add_item (rcvmod_tree,
4374
0
                                 hf_docsis_rcv_mod_enc_phy_layr_parms, tvb, pos,
4375
0
                                 length, ENC_NA);
4376
0
            break;
4377
0
          default:
4378
0
            dissect_unknown_tlv (tvb, pinfo, rcvmod_tree, pos - 2, length + 2);
4379
0
            break;
4380
0
        }                       /* switch */
4381
0
      pos = pos + length;
4382
0
    }                           /* while */
4383
0
}
4384
4385
static void
4386
dissect_rcp_rcv_ch(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4387
0
{
4388
0
  uint8_t type, length;
4389
0
  proto_tree *rcvch_tree;
4390
0
  proto_item *rcvch_item;
4391
0
  int pos = start;
4392
4393
0
  rcvch_tree =
4394
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcp_rcv_ch, &rcvch_item,
4395
0
                                  ".5 Receive Channels (Length = %u)", len);
4396
4397
0
  while (pos < (start + len))
4398
0
    {
4399
0
      type = tvb_get_uint8 (tvb, pos++);
4400
0
      length = tvb_get_uint8 (tvb, pos++);
4401
0
      switch (type)
4402
0
        {
4403
0
          case RCV_CH_IDX:
4404
0
            if (length == 1)
4405
0
              {
4406
0
                proto_tree_add_item (rcvch_tree,
4407
0
                                     hf_docsis_rcv_ch_idx, tvb, pos,
4408
0
                                     length, ENC_BIG_ENDIAN);
4409
0
              }
4410
0
            else
4411
0
              {
4412
0
                expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4413
0
              }
4414
0
            break;
4415
0
          case RCV_CH_CONN:
4416
0
            proto_tree_add_item (rcvch_tree,
4417
0
                                 hf_docsis_rcv_ch_conn, tvb, pos,
4418
0
                                 length, ENC_NA);
4419
0
            break;
4420
0
          case RCV_CH_CONN_OFF:
4421
0
            if (length == 1)
4422
0
              {
4423
0
                proto_tree_add_item (rcvch_tree,
4424
0
                                     hf_docsis_rcv_ch_conn_off, tvb, pos,
4425
0
                                     length, ENC_BIG_ENDIAN);
4426
0
              }
4427
0
            else
4428
0
              {
4429
0
                expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4430
0
              }
4431
0
            break;
4432
0
          case RCV_CH_PRIM_DS_CH_IND:
4433
0
            if (length == 1)
4434
0
              {
4435
0
                proto_tree_add_item (rcvch_tree,
4436
0
                                     hf_docsis_rcv_ch_prim_ds_ch_ind, tvb, pos,
4437
0
                                     length, ENC_BIG_ENDIAN);
4438
0
              }
4439
0
            else
4440
0
              {
4441
0
                expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4442
0
              }
4443
0
            break;
4444
0
          default:
4445
0
            dissect_unknown_tlv (tvb, pinfo, rcvch_tree, pos - 2, length + 2);
4446
0
            break;
4447
0
        }                       /* switch */
4448
0
      pos = pos + length;
4449
0
    }                           /* while */
4450
0
}
4451
4452
4453
static void
4454
dissect_rcp(tvbuff_t * tvb, packet_info * pinfo,
4455
            proto_tree *tree, int start, uint16_t len)
4456
0
{
4457
0
  uint8_t type, length;
4458
0
  proto_tree *rcp_tree;
4459
0
  proto_item *rcp_item;
4460
0
  int pos = start;
4461
0
  tvbuff_t *vsif_tvb;
4462
4463
0
  rcp_tree =
4464
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcp, &rcp_item,
4465
0
                                  "48 Receive Channel Profile (Length = %u)", len);
4466
4467
0
  while (pos < (start + len))
4468
0
    {
4469
0
      type = tvb_get_uint8 (tvb, pos++);
4470
0
      length = tvb_get_uint8 (tvb, pos++);
4471
0
      switch (type)
4472
0
        {
4473
0
          case TLV_RCP_ID:
4474
0
            if (length == 5)
4475
0
              {
4476
0
                proto_tree_add_item (rcp_tree,
4477
0
                                     hf_docsis_tlv_rcp_id, tvb, pos,
4478
0
                                     length, ENC_NA);
4479
0
              }
4480
0
            else
4481
0
              {
4482
0
                expert_add_info_format(pinfo, rcp_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4483
0
              }
4484
0
            break;
4485
0
          case TLV_RCP_NAME:
4486
0
            if (length <= 15)
4487
0
              {
4488
0
                proto_tree_add_item (rcp_tree,
4489
0
                                     hf_docsis_tlv_rcp_name, tvb, pos,
4490
0
                                     length, ENC_NA);
4491
0
              }
4492
0
            else
4493
0
              {
4494
0
                expert_add_info_format(pinfo, rcp_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4495
0
              }
4496
0
            break;
4497
0
          case TLV_RCP_FREQ_SPC:
4498
0
            if (length == 1)
4499
0
              {
4500
0
                proto_tree_add_item (rcp_tree,
4501
0
                                     hf_docsis_tlv_rcp_freq_spc, tvb, pos,
4502
0
                                     length, ENC_BIG_ENDIAN);
4503
0
              }
4504
0
            else
4505
0
              {
4506
0
                expert_add_info_format(pinfo, rcp_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4507
0
              }
4508
0
            break;
4509
0
          case TLV_RCP_RCV_MOD_ENC:
4510
0
            dissect_rcp_rcv_mod(tvb, pinfo, rcp_tree, pos, length);
4511
0
            break;
4512
0
          case TLV_RCP_RCV_CH:
4513
0
            dissect_rcp_rcv_ch(tvb, pinfo, rcp_tree, pos, length);
4514
0
            break;
4515
0
          case TLV_RCP_VEN_SPEC:
4516
0
            vsif_tvb = tvb_new_subset_length (tvb, pos, length);
4517
0
            call_dissector (docsis_vsif_handle, vsif_tvb, pinfo, rcp_tree);
4518
0
            break;
4519
0
          default:
4520
0
            dissect_unknown_tlv (tvb, pinfo, rcp_tree, pos - 2, length + 2);
4521
0
            break;
4522
0
        }                       /* switch */
4523
0
      pos = pos + length;
4524
0
    }                           /* while */
4525
0
}
4526
4527
static void
4528
dissect_rcc_rcv_mod(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4529
0
{
4530
0
  uint8_t type, length;
4531
0
  proto_tree *rcvmod_tree;
4532
0
  proto_item *rcvmod_item;
4533
0
  int pos = start;
4534
4535
0
  rcvmod_tree =
4536
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_rcv_mod_enc, &rcvmod_item,
4537
0
                                  ".4 Receive Module Assignment (Length = %u)", len);
4538
4539
0
  while (pos < (start + len))
4540
0
    {
4541
0
      type = tvb_get_uint8 (tvb, pos++);
4542
0
      length = tvb_get_uint8 (tvb, pos++);
4543
0
      switch (type)
4544
0
        {
4545
0
          case RCV_MOD_ENC_IDX:
4546
0
            if (length == 1)
4547
0
              {
4548
0
                proto_tree_add_item (rcvmod_tree,
4549
0
                                     hf_docsis_rcc_rcv_mod_enc_idx, tvb, pos,
4550
0
                                     length, ENC_BIG_ENDIAN);
4551
0
              }
4552
0
            else
4553
0
              {
4554
0
                expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4555
0
              }
4556
0
            break;
4557
0
          case RCV_MOD_ENC_CTR_FREQ_ASGN:
4558
0
            if (length == 4)
4559
0
              {
4560
0
                proto_tree_add_item (rcvmod_tree,
4561
0
                                     hf_docsis_rcc_rcv_mod_enc_ctr_freq_asgn, tvb, pos,
4562
0
                                     length, ENC_BIG_ENDIAN);
4563
0
              }
4564
0
            else
4565
0
              {
4566
0
                expert_add_info_format(pinfo, rcvmod_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4567
0
              }
4568
0
            break;
4569
0
          case RCV_MOD_ENC_CONN:
4570
0
            proto_tree_add_item (rcvmod_tree,
4571
0
                                 hf_docsis_rcc_rcv_mod_enc_conn, tvb, pos,
4572
0
                                 length, ENC_NA);
4573
0
            break;
4574
0
          default:
4575
0
            dissect_unknown_tlv (tvb, pinfo, rcvmod_tree, pos - 2, length + 2);
4576
0
            break;
4577
0
        }                       /* switch */
4578
0
      pos = pos + length;
4579
0
    }                           /* while */
4580
0
}
4581
4582
static void
4583
dissect_rcc_rcv_ch(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4584
0
{
4585
0
  uint8_t type, length;
4586
0
  proto_tree *rcvch_tree;
4587
0
  proto_item *rcvch_item;
4588
0
  int pos = start;
4589
4590
0
  rcvch_tree =
4591
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_rcv_ch, &rcvch_item,
4592
0
                                  ".5 Receive Channels (Length = %u)", len);
4593
4594
0
  while (pos < (start + len))
4595
0
    {
4596
0
      type = tvb_get_uint8 (tvb, pos++);
4597
0
      length = tvb_get_uint8 (tvb, pos++);
4598
0
      switch (type)
4599
0
        {
4600
0
          case RCV_CH_IDX:
4601
0
            if (length == 1)
4602
0
              {
4603
0
                proto_tree_add_item (rcvch_tree,
4604
0
                                     hf_docsis_rcc_rcv_ch_idx, tvb, pos,
4605
0
                                     length, ENC_BIG_ENDIAN);
4606
0
              }
4607
0
            else
4608
0
              {
4609
0
                expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4610
0
              }
4611
0
            break;
4612
0
          case RCV_CH_CONN:
4613
0
            proto_tree_add_item (rcvch_tree,
4614
0
                                 hf_docsis_rcc_rcv_ch_conn, tvb, pos,
4615
0
                                 length, ENC_NA);
4616
0
            break;
4617
0
          case RCV_CH_CTR_FREQ_ASGN:
4618
0
            if (length == 4)
4619
0
              {
4620
0
                proto_tree_add_item (rcvch_tree,
4621
0
                                     hf_docsis_rcc_rcv_ch_ctr_freq_asgn, tvb, pos,
4622
0
                                     length, ENC_BIG_ENDIAN);
4623
0
              }
4624
0
            else
4625
0
              {
4626
0
                expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4627
0
              }
4628
0
            break;
4629
0
          case RCV_CH_PRIM_DS_CH_IND:
4630
0
            if (length == 1)
4631
0
              {
4632
0
                proto_tree_add_item (rcvch_tree,
4633
0
                                     hf_docsis_rcc_rcv_ch_prim_ds_ch_ind, tvb, pos,
4634
0
                                     length, ENC_BIG_ENDIAN);
4635
0
              }
4636
0
            else
4637
0
              {
4638
0
                expert_add_info_format(pinfo, rcvch_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4639
0
              }
4640
0
            break;
4641
0
          default:
4642
0
            dissect_unknown_tlv (tvb, pinfo, rcvch_tree, pos - 2, length + 2);
4643
0
            break;
4644
0
        }                       /* switch */
4645
0
      pos = pos + length;
4646
0
    }                           /* while */
4647
0
}
4648
4649
static void
4650
dissect_rcc_partial_serv_down_chan(tvbuff_t * tvb, proto_tree *tree, int start, uint16_t len)
4651
0
{
4652
0
  proto_tree *rcc_partial_serv_down_chan_tree;
4653
0
  proto_item *rcc_partial_serv_down_chan_item;
4654
0
  int pos = start;
4655
0
  int i = 0;
4656
4657
0
  rcc_partial_serv_down_chan_tree =
4658
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_partial_serv_down_chan, &rcc_partial_serv_down_chan_item,
4659
0
                                  ".6 Partial Service Downstream Channels (Length = %u)", len);
4660
0
  for (i=0; i< len; ++i)
4661
0
    {
4662
0
      proto_tree_add_item (rcc_partial_serv_down_chan_tree,
4663
0
                           hf_docsis_tlv_rcc_partial_serv_down_chan_id, tvb, pos+i,
4664
0
                           1, ENC_BIG_ENDIAN);
4665
0
    }
4666
0
}
4667
4668
static void
4669
dissect_rcc_srcc_prim_ds_ch_assign(tvbuff_t * tvb, proto_tree *tree, int start, uint16_t len)
4670
0
{
4671
0
  proto_tree *rcc_srcc_prim_ds_assign_tree;
4672
0
  proto_item *rcc_srcc_prim_ds_assign_item;
4673
0
  int pos = start;
4674
0
  int i = 0;
4675
4676
0
  rcc_srcc_prim_ds_assign_tree =
4677
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_srcc_prim_ds_assign, &rcc_srcc_prim_ds_assign_item,
4678
0
                                  "..1 RCC SRCC Primary Downstream Channel Assignment (Length = %u)", len);
4679
0
  for (i=0; i< len; ++i)
4680
0
    {
4681
0
      proto_tree_add_item (rcc_srcc_prim_ds_assign_tree,
4682
0
                           hf_docsis_tlv_rcc_srcc_prim_ds_chan_assign_ds_ch_id, tvb, pos+i,
4683
0
                           1, ENC_BIG_ENDIAN);
4684
0
    }
4685
0
}
4686
4687
static void
4688
dissect_rcc_srcc_ds_ch_assign(tvbuff_t * tvb, proto_tree *tree, int start, uint16_t len)
4689
0
{
4690
0
  proto_tree *rcc_srcc_ds_assign_tree;
4691
0
  proto_item *rcc_srcc_ds_assign_item;
4692
0
  int pos = start;
4693
0
  int i = 0;
4694
4695
0
  rcc_srcc_ds_assign_tree =
4696
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_srcc_ds_assign, &rcc_srcc_ds_assign_item,
4697
0
                                  "..2 RCC SRCC Downstream Channel Assignment (Length = %u)", len);
4698
0
  for (i=0; i< len; ++i)
4699
0
    {
4700
0
      proto_tree_add_item (rcc_srcc_ds_assign_tree,
4701
0
                           hf_docsis_tlv_rcc_srcc_ds_chan_assign_ds_ch_id, tvb, pos+i,
4702
0
                           1, ENC_BIG_ENDIAN);
4703
0
    }
4704
0
}
4705
4706
static void
4707
dissect_rcc_srcc_ds_prof_assign_prof_list(tvbuff_t * tvb, proto_tree *tree, int start, uint16_t len)
4708
0
{
4709
0
  proto_tree *rcc_srcc_ds_prof_assign_prof_list_tree;
4710
0
  proto_item *rcc_srcc_ds_prof_assign_prof_list_item;
4711
0
  int pos = start;
4712
0
  int i = 0;
4713
4714
0
  rcc_srcc_ds_prof_assign_prof_list_tree =
4715
0
    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,
4716
0
                                  "....2 RCC SRCC Downstream Profile Assignment - Profile List (Length = %u)", len);
4717
0
  for (i=0; i< len; ++i)
4718
0
    {
4719
0
      proto_tree_add_item (rcc_srcc_ds_prof_assign_prof_list_tree,
4720
0
                           hf_docsis_tlv_rcc_srcc_ds_prof_asssign_prof_list_prof_id, tvb, pos+i,
4721
0
                           1, ENC_BIG_ENDIAN);
4722
0
    }
4723
0
}
4724
4725
static void
4726
dissect_rcc_srcc_ds_prof_assign(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4727
0
{
4728
0
  uint8_t type, length;
4729
0
  proto_tree *rcc_srcc_ds_prof_assign_tree;
4730
0
  proto_item *rcc_srcc_ds_prof_assign_item;
4731
0
  int pos = start;
4732
4733
0
  rcc_srcc_ds_prof_assign_tree =
4734
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_srcc_ds_prof_assign, &rcc_srcc_ds_prof_assign_item,
4735
0
                                  "..3 RCC SRCC Downstream Profile Assignment(Length = %u)", len);
4736
0
  while (pos < (start + len))
4737
0
    {
4738
0
      type = tvb_get_uint8 (tvb, pos++);
4739
0
      length = tvb_get_uint8 (tvb, pos++);
4740
0
      switch (type)
4741
0
        {
4742
0
          case RCC_SRCC_DS_PROF_ASSIGN_DCID:
4743
0
            if (length == 1)
4744
0
              {
4745
0
                proto_tree_add_item (rcc_srcc_ds_prof_assign_tree,
4746
0
                                     hf_docsis_tlv_rcc_srcc_ds_prof_assign_dcid, tvb, pos,
4747
0
                                     length, ENC_BIG_ENDIAN);
4748
0
              }
4749
0
            else
4750
0
              {
4751
0
                expert_add_info_format(pinfo, rcc_srcc_ds_prof_assign_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4752
0
              }
4753
0
            break;
4754
0
          case RCC_SRCC_DS_PROF_ASSIGN_PROF_LIST:
4755
0
            dissect_rcc_srcc_ds_prof_assign_prof_list(tvb, rcc_srcc_ds_prof_assign_tree, pos, length);
4756
0
            break;
4757
0
          default:
4758
0
            dissect_unknown_tlv (tvb, pinfo, rcc_srcc_ds_prof_assign_tree, pos - 2, length + 2);
4759
0
            break;
4760
0
        }                       /* switch */
4761
0
      pos = pos + length;
4762
0
    }                           /* while */
4763
0
}
4764
4765
static void
4766
dissect_rcc_srcc(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4767
0
{
4768
0
  uint8_t type, length;
4769
0
  proto_tree *rcc_srcc_tree;
4770
0
  proto_item *rcc_srcc_item;
4771
0
  int pos = start;
4772
4773
0
  rcc_srcc_tree =
4774
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_srcc, &rcc_srcc_item,
4775
0
                                  ".7 RCC Simplified Receive Channel Configuration (Length = %u)", len);
4776
0
  while (pos < (start + len))
4777
0
    {
4778
0
      type = tvb_get_uint8 (tvb, pos++);
4779
0
      length = tvb_get_uint8 (tvb, pos++);
4780
0
      switch (type)
4781
0
        {
4782
0
          case RCC_SRCC_PRIM_DS_CHAN_ASSIGN:
4783
0
            dissect_rcc_srcc_prim_ds_ch_assign(tvb, rcc_srcc_tree, pos, length);
4784
0
            break;
4785
0
          case RCC_SRCC_DS_CHAN_ASSIGN:
4786
0
            dissect_rcc_srcc_ds_ch_assign(tvb, rcc_srcc_tree, pos, length);
4787
0
            break;
4788
0
          case RCC_SRCC_DS_PROF_ASSIGN:
4789
0
            dissect_rcc_srcc_ds_prof_assign(tvb, pinfo, rcc_srcc_tree, pos, length);
4790
0
            break;
4791
0
          default:
4792
0
            dissect_unknown_tlv (tvb, pinfo, rcc_srcc_tree, pos - 2, length + 2);
4793
0
            break;
4794
0
        }                       /* switch */
4795
0
      pos = pos + length;
4796
0
    }                           /* while */
4797
0
}
4798
4799
static void
4800
dissect_rcc_err(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4801
0
{
4802
0
  uint8_t type, length;
4803
0
  proto_tree *err_tree;
4804
0
  proto_item *err_item;
4805
0
  int pos = start;
4806
4807
0
  err_tree =
4808
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc_rcv_ch, &err_item,
4809
0
                                  ".254 RCC Error Encodings (Length = %u)", len);
4810
4811
0
  while (pos < (start + len))
4812
0
    {
4813
0
      type = tvb_get_uint8 (tvb, pos++);
4814
0
      length = tvb_get_uint8 (tvb, pos++);
4815
0
      switch (type)
4816
0
        {
4817
0
          case RCC_ERR_MOD_OR_CH:
4818
0
            if (length == 1)
4819
0
              {
4820
0
                proto_tree_add_item (err_tree,
4821
0
                                     hf_docsis_tlv_rcc_err_mod_or_ch, tvb, pos,
4822
0
                                     length, ENC_BIG_ENDIAN);
4823
0
              }
4824
0
            else
4825
0
              {
4826
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4827
0
              }
4828
0
            break;
4829
0
          case RCC_ERR_IDX:
4830
0
            if (length == 1)
4831
0
              {
4832
0
                proto_tree_add_item (err_tree,
4833
0
                                     hf_docsis_tlv_rcc_err_idx, tvb, pos,
4834
0
                                     length, ENC_BIG_ENDIAN);
4835
0
              }
4836
0
            else
4837
0
              {
4838
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4839
0
              }
4840
0
            break;
4841
0
          case RCC_ERR_PARAM:
4842
0
            if (length == 1)
4843
0
              {
4844
0
                proto_tree_add_item (err_tree,
4845
0
                                     hf_docsis_tlv_rcc_err_param, tvb, pos,
4846
0
                                     length, ENC_BIG_ENDIAN);
4847
0
              }
4848
0
            else
4849
0
              {
4850
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4851
0
              }
4852
0
            break;
4853
0
          case RCC_ERR_CODE:
4854
0
            if (length == 1)
4855
0
              {
4856
0
                proto_tree_add_item (err_tree,
4857
0
                                     hf_docsis_tlv_rcc_err_code, tvb, pos,
4858
0
                                     length, ENC_BIG_ENDIAN);
4859
0
              }
4860
0
            else
4861
0
              {
4862
0
                expert_add_info_format(pinfo, err_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4863
0
              }
4864
0
            break;
4865
0
          case RCC_ERR_MSG:
4866
0
            proto_tree_add_item (err_tree,
4867
0
                                 hf_docsis_tlv_rcc_err_msg, tvb, pos,
4868
0
                                 length, ENC_NA);
4869
0
            break;
4870
0
          default:
4871
0
            dissect_unknown_tlv (tvb, pinfo, err_tree, pos - 2, length + 2);
4872
0
            break;
4873
0
        }                       /* switch */
4874
0
      pos = pos + length;
4875
0
    }                           /* while */
4876
0
}
4877
4878
static void
4879
dissect_rcc(tvbuff_t * tvb, packet_info * pinfo,
4880
            proto_tree *tree, int start, uint16_t len)
4881
0
{
4882
0
  uint8_t type, length;
4883
0
  proto_tree *rcc_tree;
4884
0
  proto_item *rcc_item;
4885
0
  int pos = start;
4886
0
  tvbuff_t *vsif_tvb;
4887
4888
0
  rcc_tree =
4889
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_rcc, &rcc_item,
4890
0
                                  "49 Receive Channel Configuration (Length = %u)", len);
4891
4892
0
  while (pos < (start + len))
4893
0
    {
4894
0
      type = tvb_get_uint8 (tvb, pos++);
4895
0
      length = tvb_get_uint8 (tvb, pos++);
4896
0
      switch (type)
4897
0
        {
4898
0
          case TLV_RCP_ID:
4899
0
            if (length == 5)
4900
0
              {
4901
0
                proto_tree_add_item (rcc_tree,
4902
0
                                     hf_docsis_tlv_rcc_id, tvb, pos,
4903
0
                                     length, ENC_NA);
4904
0
              }
4905
0
            else
4906
0
              {
4907
0
                expert_add_info_format(pinfo, rcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4908
0
              }
4909
0
            break;
4910
0
          case TLV_RCP_RCV_MOD_ENC:
4911
0
            dissect_rcc_rcv_mod(tvb, pinfo, rcc_tree, pos, length);
4912
0
            break;
4913
0
          case TLV_RCP_RCV_CH:
4914
0
            dissect_rcc_rcv_ch(tvb, pinfo, rcc_tree, pos, length);
4915
0
            break;
4916
0
          case TLV_RCP_VEN_SPEC:
4917
0
            vsif_tvb = tvb_new_subset_length (tvb, pos, length);
4918
0
            call_dissector (docsis_vsif_handle, vsif_tvb, pinfo, rcc_tree);
4919
0
            break;
4920
0
          case TLV_RCC_PARTIAL_SERV_DOWN_CHAN:
4921
0
            dissect_rcc_partial_serv_down_chan(tvb, rcc_tree, pos, length);
4922
0
            break;
4923
0
          case TLV_RCC_SRCC:
4924
0
            dissect_rcc_srcc(tvb, pinfo, rcc_tree, pos, length);
4925
0
            break;
4926
0
          case TLV_RCC_PRIM_DOWN_CHAN:
4927
0
            if (length == 1)
4928
0
              {
4929
0
                proto_tree_add_item (rcc_tree,
4930
0
                                     hf_docsis_tlv_rcc_prim_down_chan, tvb, pos,
4931
0
                                     length, ENC_NA);
4932
0
              }
4933
0
            else
4934
0
              {
4935
0
                expert_add_info_format(pinfo, rcc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4936
0
              }
4937
0
            break;
4938
0
          case TLV_RCC_ERR:
4939
0
            dissect_rcc_err(tvb, pinfo, rcc_tree, pos, length);
4940
0
            break;
4941
0
          default:
4942
0
            dissect_unknown_tlv (tvb, pinfo, rcc_tree, pos - 2, length + 2);
4943
0
            break;
4944
0
        }                       /* switch */
4945
0
      pos = pos + length;
4946
0
    }                           /* while */
4947
0
}
4948
4949
static void
4950
dissect_dsid_ds_reseq(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
4951
0
{
4952
0
  uint8_t type, length;
4953
0
  proto_tree *dsid_tree;
4954
0
  proto_item *dsid_item;
4955
0
  int pos = start;
4956
4957
0
  dsid_tree =
4958
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid_ds_reseq, &dsid_item,
4959
0
                                  ".3 Resequencing DSID (Length = %u)", len);
4960
4961
0
  while (pos < (start + len))
4962
0
    {
4963
0
      type = tvb_get_uint8 (tvb, pos++);
4964
0
      length = tvb_get_uint8 (tvb, pos++);
4965
0
      switch (type)
4966
0
        {
4967
0
          case DS_RESEQ_DSID:
4968
0
            if (length == 1)
4969
0
              {
4970
0
                proto_tree_add_item (dsid_tree,
4971
0
                                     hf_docsis_ds_reseq_dsid, tvb, pos,
4972
0
                                     length, ENC_BIG_ENDIAN);
4973
0
              }
4974
0
            else
4975
0
              {
4976
0
                expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4977
0
              }
4978
0
            break;
4979
0
          case DS_RESEQ_CH_LST:
4980
0
            proto_tree_add_item (dsid_tree,
4981
0
                                 hf_docsis_ds_reseq_ch_lst, tvb, pos,
4982
0
                                 length, ENC_NA);
4983
0
            break;
4984
0
          case DS_RESEQ_WAIT_TIME:
4985
0
            if (length == 1)
4986
0
              {
4987
0
                proto_tree_add_item (dsid_tree,
4988
0
                                     hf_docsis_ds_reseq_wait_time, tvb, pos,
4989
0
                                     length, ENC_BIG_ENDIAN);
4990
0
              }
4991
0
            else
4992
0
              {
4993
0
                expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
4994
0
              }
4995
0
            break;
4996
0
          case DS_RESEQ_WARN_THRESH:
4997
0
            if (length == 1)
4998
0
              {
4999
0
                proto_tree_add_item (dsid_tree,
5000
0
                                     hf_docsis_ds_reseq_warn_thresh, tvb, pos,
5001
0
                                     length, ENC_BIG_ENDIAN);
5002
0
              }
5003
0
            else
5004
0
              {
5005
0
                expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5006
0
              }
5007
0
            break;
5008
0
          case DS_RESEQ_HO_TIMER:
5009
0
            if (length == 2)
5010
0
              {
5011
0
                proto_tree_add_item (dsid_tree,
5012
0
                                     hf_docsis_ds_reseq_ho_timer, tvb, pos,
5013
0
                                     length, ENC_BIG_ENDIAN);
5014
0
              }
5015
0
            else
5016
0
              {
5017
0
                expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5018
0
              }
5019
0
            break;
5020
0
          default:
5021
0
            dissect_unknown_tlv (tvb, pinfo, dsid_tree, pos - 2, length + 2);
5022
0
            break;
5023
0
        }                       /* switch */
5024
0
      pos = pos + length;
5025
0
    }                           /* while */
5026
0
}
5027
5028
static void
5029
dissect_dsid_mc_addr(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
5030
0
{
5031
0
  uint8_t type, length;
5032
0
  proto_tree *dsid_tree;
5033
0
  proto_item *dsid_item;
5034
0
  int pos = start;
5035
5036
0
  dsid_tree =
5037
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid_mc_addr, &dsid_item,
5038
0
                                  "..1 Client MAC Address Encodings (Length = %u)", len);
5039
5040
0
  while (pos < (start + len))
5041
0
    {
5042
0
      type = tvb_get_uint8 (tvb, pos++);
5043
0
      length = tvb_get_uint8 (tvb, pos++);
5044
0
      switch (type)
5045
0
        {
5046
0
          case MC_ADDR_ACTION:
5047
0
            if (length == 1)
5048
0
              {
5049
0
                proto_tree_add_item (dsid_tree,
5050
0
                                     hf_docsis_mc_addr_action, tvb, pos,
5051
0
                                     length, ENC_BIG_ENDIAN);
5052
0
              }
5053
0
            else
5054
0
              {
5055
0
                expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5056
0
              }
5057
0
            break;
5058
0
          case MC_ADDR_ADDR:
5059
0
            if (length == 6)
5060
0
              {
5061
0
                proto_tree_add_item (dsid_tree,
5062
0
                                     hf_docsis_mc_addr_addr, tvb, pos,
5063
0
                                     length, ENC_NA);
5064
0
              }
5065
0
            else
5066
0
              {
5067
0
                expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5068
0
              }
5069
0
            break;
5070
0
         default:
5071
0
           dissect_unknown_tlv (tvb, pinfo, dsid_tree, pos - 2, length + 2);
5072
0
           break;
5073
0
        }                       /* switch */
5074
0
      pos = pos + length;
5075
0
    }                           /* while */
5076
0
}
5077
5078
static void
5079
dissect_dsid_mc(tvbuff_t * tvb, packet_info *pinfo, proto_tree *tree, int start, uint16_t len)
5080
0
{
5081
0
  uint8_t type, length;
5082
0
  proto_tree *dsid_tree;
5083
0
  int pos = start;
5084
5085
0
  dsid_tree =
5086
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid_mc, NULL,
5087
0
                                  ".4 Multicast Encodings (Length = %u)", len);
5088
5089
0
  while (pos < (start + len))
5090
0
    {
5091
0
      type = tvb_get_uint8 (tvb, pos++);
5092
0
      length = tvb_get_uint8 (tvb, pos++);
5093
0
      switch (type)
5094
0
        {
5095
0
          case TLV_DSID_MC_ADDR:
5096
0
            dissect_dsid_mc_addr(tvb, pinfo, dsid_tree, pos, length);
5097
0
            break;
5098
0
          case TLV_DSID_MC_CMIM:
5099
0
            proto_tree_add_item (dsid_tree,
5100
0
                                 hf_docsis_tlv_dsid_mc_cmim, tvb, pos,
5101
0
                                 length, ENC_NA);
5102
0
            break;
5103
0
          case TLV_DSID_MC_GROUP:
5104
0
            proto_tree_add_item (dsid_tree,
5105
0
                                 hf_docsis_tlv_dsid_mc_group, tvb, pos,
5106
0
                                 length, ENC_NA);
5107
0
            break;
5108
0
          case TLV_DSID_MC_PHS:
5109
0
            dissect_phs(tvb, pinfo, dsid_tree, pos, length);
5110
0
            break;
5111
0
          default:
5112
0
            dissect_unknown_tlv (tvb, pinfo, dsid_tree, pos - 2, length + 2);
5113
0
            break;
5114
0
        }                       /* switch */
5115
0
      pos = pos + length;
5116
0
    }                           /* while */
5117
0
}
5118
5119
static void
5120
dissect_dsid(tvbuff_t * tvb, packet_info *pinfo, proto_tree *tree, int start, uint16_t len)
5121
0
{
5122
0
  uint8_t type, length;
5123
0
  proto_tree *dsid_tree;
5124
0
  proto_item *dsid_item;
5125
0
  int pos = start;
5126
5127
0
  dsid_tree =
5128
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid, &dsid_item,
5129
0
                                  "50 DSID Encodings (Length = %u)", len);
5130
5131
0
  while (pos < (start + len))
5132
0
    {
5133
0
      type = tvb_get_uint8 (tvb, pos++);
5134
0
      length = tvb_get_uint8 (tvb, pos++);
5135
0
      switch (type)
5136
0
        {
5137
0
          case TLV_DSID_ID:
5138
0
            if (length == 3)
5139
0
              {
5140
0
                proto_tree_add_item (dsid_tree,
5141
0
                                     hf_docsis_tlv_dsid_id, tvb, pos,
5142
0
                                     length, ENC_BIG_ENDIAN);
5143
0
              }
5144
0
            else
5145
0
              {
5146
0
               expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5147
0
              }
5148
0
            break;
5149
0
          case TLV_DSID_ACTION:
5150
0
            if (length == 1)
5151
0
              {
5152
0
                proto_tree_add_item (dsid_tree,
5153
0
                                     hf_docsis_tlv_dsid_action, tvb, pos,
5154
0
                                     length, ENC_BIG_ENDIAN);
5155
0
              }
5156
0
            else
5157
0
              {
5158
0
               expert_add_info_format(pinfo, dsid_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5159
0
              }
5160
0
            break;
5161
0
          case TLV_DSID_DS_RESEQ:
5162
0
            dissect_dsid_ds_reseq(tvb, pinfo, dsid_tree, pos, length);
5163
0
            break;
5164
0
          case TLV_DSID_MC:
5165
0
            dissect_dsid_mc(tvb, pinfo, dsid_tree, pos, length);
5166
0
            break;
5167
0
          default:
5168
0
            dissect_unknown_tlv (tvb, pinfo, dsid_tree, pos - 2, length + 2);
5169
0
            break;
5170
0
        }                       /* switch */
5171
0
      pos = pos + length;
5172
0
    }                           /* while */
5173
0
}
5174
5175
static void
5176
dissect_sec_assoc(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
5177
0
{
5178
0
  uint8_t type, length;
5179
0
  proto_tree *sec_tree;
5180
0
  proto_item *sec_item;
5181
0
  int pos = start;
5182
5183
0
  sec_tree =
5184
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_dsid, &sec_item,
5185
0
                                  "51 Security Association Encodings (Length = %u)", len);
5186
5187
0
  while (pos < (start + len))
5188
0
    {
5189
0
      type = tvb_get_uint8 (tvb, pos++);
5190
0
      length = tvb_get_uint8 (tvb, pos++);
5191
0
      switch (type)
5192
0
        {
5193
0
          case TLV_SEC_ASSOC_ACTION:
5194
0
            if (length == 1)
5195
0
              {
5196
0
                proto_tree_add_item (sec_tree,
5197
0
                                     hf_docsis_tlv_sec_assoc_action, tvb, pos,
5198
0
                                     length, ENC_BIG_ENDIAN);
5199
0
              }
5200
0
            else
5201
0
              {
5202
0
                expert_add_info_format(pinfo, sec_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5203
0
              }
5204
0
            break;
5205
0
          case TLV_SEC_ASSOC_DESC:
5206
0
            if (length == 14)
5207
0
              {
5208
0
                proto_tree_add_item (sec_tree,
5209
0
                                     hf_docsis_tlv_sec_assoc_desc, tvb, pos,
5210
0
                                     length, ENC_NA);
5211
0
              }
5212
0
            else
5213
0
              {
5214
0
                expert_add_info_format(pinfo, sec_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5215
0
              }
5216
0
            break;
5217
0
          default:
5218
0
            dissect_unknown_tlv (tvb, pinfo, sec_tree, pos - 2, length + 2);
5219
0
            break;
5220
0
        }                       /* switch */
5221
0
      pos = pos + length;
5222
0
    }                           /* while */
5223
0
}
5224
5225
static void
5226
dissect_ch_asgn(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
5227
0
{
5228
0
  uint8_t type, length;
5229
0
  proto_tree *asgn_tree;
5230
0
  proto_item *asgn_item;
5231
0
  int pos = start;
5232
5233
0
  asgn_tree =
5234
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_ch_asgn, &asgn_item,
5235
0
                                  "56 Channel Assignment Configuration Settings (Length = %u)", len);
5236
5237
0
  while (pos < (start + len))
5238
0
    {
5239
0
      type = tvb_get_uint8 (tvb, pos++);
5240
0
      length = tvb_get_uint8 (tvb, pos++);
5241
0
      switch (type)
5242
0
        {
5243
0
          case TLV_CH_ASGN_US_CH_ID:
5244
0
            if (length == 1)
5245
0
              {
5246
0
                proto_tree_add_item (asgn_tree,
5247
0
                                     hf_docsis_ch_asgn_us_ch_id, tvb, pos,
5248
0
                                     length, ENC_BIG_ENDIAN);
5249
0
              }
5250
0
            else
5251
0
              {
5252
0
                expert_add_info_format(pinfo, asgn_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5253
0
              }
5254
0
            break;
5255
0
          case TLV_CH_ASGN_RX_FREQ:
5256
0
            if (length == 4)
5257
0
              {
5258
0
                proto_tree_add_item (asgn_tree,
5259
0
                                     hf_docsis_ch_asgn_rx_freq, tvb, pos,
5260
0
                                     length, ENC_BIG_ENDIAN);
5261
0
              }
5262
0
            else
5263
0
              {
5264
0
                expert_add_info_format(pinfo, asgn_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5265
0
              }
5266
0
            break;
5267
0
          default:
5268
0
            dissect_unknown_tlv (tvb, pinfo, asgn_tree, pos - 2, length + 2);
5269
0
            break;
5270
0
        }                       /* switch */
5271
0
      pos = pos + length;
5272
0
    }                           /* while */
5273
0
}
5274
5275
static void
5276
dissect_cmts_mc_sess_enc(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
5277
0
{
5278
0
  uint8_t type, length;
5279
0
  proto_tree *mc_tree;
5280
0
  proto_item *mc_item;
5281
0
  int pos = start;
5282
5283
0
  mc_tree =
5284
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_cmts_mc_sess_enc, &mc_item,
5285
0
                                  "64 CMTS Static Multicast Session Encoding (Length = %u)", len);
5286
5287
0
  while (pos < (start + len))
5288
0
    {
5289
0
      type = tvb_get_uint8 (tvb, pos++);
5290
0
      length = tvb_get_uint8 (tvb, pos++);
5291
0
      switch (type)
5292
0
        {
5293
0
          case CMTS_MC_SESS_ENC_GRP:
5294
0
            if (length == 4 || length == 16)
5295
0
              {
5296
0
                proto_tree_add_item (mc_tree,
5297
0
                                     hf_docsis_cmts_mc_sess_enc_grp, tvb, pos,
5298
0
                                     length, ENC_NA);
5299
0
              }
5300
0
            else
5301
0
              {
5302
0
                expert_add_info_format(pinfo, mc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5303
0
              }
5304
0
            break;
5305
0
          case CMTS_MC_SESS_ENC_SRC:
5306
0
            if (length == 4 || length == 16)
5307
0
              {
5308
0
                proto_tree_add_item (mc_tree,
5309
0
                                     hf_docsis_cmts_mc_sess_enc_src, tvb, pos,
5310
0
                                     length, ENC_NA);
5311
0
              }
5312
0
            else
5313
0
              {
5314
0
                expert_add_info_format(pinfo, mc_item, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5315
0
              }
5316
0
            break;
5317
0
          case CMTS_MC_SESS_ENC_CMIM:
5318
0
            proto_tree_add_item (mc_tree,
5319
0
                                     hf_docsis_cmts_mc_sess_enc_cmim, tvb, pos,
5320
0
                                     length, ENC_NA);
5321
0
            break;
5322
0
          default:
5323
0
            dissect_unknown_tlv (tvb, pinfo, mc_tree, pos - 2, length + 2);
5324
0
            break;
5325
0
        }                       /* switch */
5326
0
      pos = pos + length;
5327
0
    }                           /* while */
5328
0
}
5329
5330
static void
5331
dissect_em_id_list_for_cm(tvbuff_t * tvb, proto_tree *tree, int start, uint16_t len)
5332
0
{
5333
0
  proto_tree *em_id_list_tree;
5334
0
  proto_item *em_id_list_item;
5335
0
  int pos = start;
5336
5337
0
  em_id_list_tree =
5338
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_em_id_list_for_cm, &em_id_list_item,
5339
0
                                  "78 Energy Management Identifier List for CM (Length = %u)", len);
5340
5341
0
  while (pos < (start + len))
5342
0
    {
5343
0
      proto_tree_add_item (em_id_list_tree, hf_docsis_tlv_em_id_list_for_cm_em_id, tvb, pos, 2, ENC_BIG_ENDIAN);
5344
0
      pos+=2;
5345
0
    }
5346
0
}
5347
5348
static void
5349
dissect_fdx_tg_assignment(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, uint16_t len)
5350
0
{
5351
0
  uint8_t type, length;
5352
0
  proto_tree *tg_assignment_tree;
5353
0
  proto_item *tg_assignment_item;
5354
0
  int pos = start;
5355
0
  tvbuff_t *rba_tvb;
5356
5357
0
  tg_assignment_tree =
5358
0
    proto_tree_add_subtree_format(tree, tvb, start, len, ett_docsis_tlv_tg_assignment, &tg_assignment_item,
5359
0
                                  "85 FDX Transmission Group Assignment (Length = %u)", len);
5360
5361
0
  while (pos < (start + len))
5362
0
    {
5363
0
      type = tvb_get_uint8 (tvb, pos++);
5364
0
      length = tvb_get_uint8 (tvb, pos++);
5365
0
      switch (type)
5366
0
        {
5367
0
          case TLV_FDX_TG_ASSIGNMENT_TG_ID:
5368
0
            if (length == 1)
5369
0
              {
5370
0
                proto_tree_add_item (tg_assignment_tree,
5371
0
                                     hf_docsis_tlv_fdx_tg_assignment_tg_id, tvb, pos,
5372
0
                                     length, ENC_BIG_ENDIAN);
5373
0
              }
5374
0
            else
5375
0
              {
5376
0
                expert_add_info_format(pinfo, tg_assignment_item, &ei_docsis_tlv_tlvlen_bad,
5377
0
                                       "Wrong TLV length: %u", length);
5378
0
              }
5379
0
            break;
5380
0
          case TLV_FDX_TG_ASSIGNMENT_RBA_TYPE:
5381
0
            if (length == 1)
5382
0
              {
5383
0
                proto_tree_add_item (tg_assignment_tree,
5384
0
                                     hf_docsis_tlv_fdx_tg_assignment_rba_type, tvb, pos,
5385
0
                                     length, ENC_BIG_ENDIAN);
5386
0
              }
5387
0
            else
5388
0
              {
5389
0
                expert_add_info_format(pinfo, tg_assignment_item, &ei_docsis_tlv_tlvlen_bad,
5390
0
                                       "Wrong TLV length: %u", length);
5391
0
              }
5392
0
            break;
5393
0
          case TLV_FDX_TG_ASSIGNMENT_RBA_MESSAGE:
5394
0
            rba_tvb = tvb_new_subset_length (tvb, pos, length);
5395
0
            call_dissector (docsis_rba_handle, rba_tvb, pinfo, tg_assignment_tree);
5396
0
            break;
5397
0
          default:
5398
0
            dissect_unknown_tlv (tvb, pinfo, tg_assignment_tree, pos - 2, length + 2);
5399
0
            break;
5400
0
        }                       /* switch */
5401
0
      pos = pos + length;
5402
0
    }                           /* while */
5403
0
}
5404
5405
static int
5406
dissect_docsis_tlv (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5407
0
{
5408
0
  proto_item *it;
5409
0
  proto_tree *tlv_tree;
5410
0
  int pos = 0;
5411
0
  int total_len;
5412
0
  uint8_t type, length;
5413
0
  uint16_t x;
5414
0
  int previous_channel_id = -1;
5415
5416
0
  total_len = tvb_reported_length_remaining (tvb, 0);
5417
5418
0
  {
5419
0
    it =
5420
0
      proto_tree_add_protocol_format (tree, proto_docsis_tlv, tvb, 0,
5421
0
                                      total_len, "TLV Data");
5422
0
    tlv_tree = proto_item_add_subtree (it, ett_docsis_tlv);
5423
0
    while (pos < total_len)
5424
0
      {
5425
0
        type = tvb_get_uint8 (tvb, pos++);
5426
0
        length = tvb_get_uint8 (tvb, pos++);
5427
0
        switch (type)
5428
0
          {
5429
0
            case TLV_DOWN_FREQ:
5430
              /* This is ugly.  There are multiple type 1 TLVs that may appear
5431
               * in the TLV data, the problem is that they are dependent on
5432
               * message type.  */
5433
0
              if (length == 4)
5434
0
                proto_tree_add_item (tlv_tree, hf_docsis_tlv_down_freq, tvb,
5435
0
                                     pos, length, ENC_BIG_ENDIAN);
5436
0
              else if (length == 1)
5437
0
                proto_tree_add_item (tlv_tree, hf_docsis_tlv_rng_tech, tvb,
5438
0
                                     pos, length, ENC_BIG_ENDIAN);
5439
0
              else
5440
0
                dissect_doc10cos (tvb, pinfo, tlv_tree, pos, length);
5441
0
              break;
5442
0
            case TLV_CHNL_ID:
5443
0
              if (length == 1)
5444
0
                {
5445
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_upstream_chid,
5446
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5447
0
                }
5448
0
              else
5449
0
                {
5450
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5451
0
                }
5452
0
              break;
5453
0
            case TLV_NET_ACCESS:
5454
0
              if (length == 1)
5455
0
                {
5456
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_net_access,
5457
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5458
0
                }
5459
0
              else
5460
0
                {
5461
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5462
0
                }
5463
0
              break;
5464
0
            case TLV_COS:
5465
0
              dissect_cos (tvb, pinfo, tlv_tree, pos, length);
5466
0
              break;
5467
0
            case TLV_MODEM_CAP:
5468
0
              dissect_modemcap (tvb, pinfo, tlv_tree, pos, length);
5469
0
              break;
5470
0
            case TLV_CM_MIC:
5471
0
              if (length == 16)
5472
0
                {
5473
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_cm_mic, tvb,
5474
0
                                       pos, length, ENC_NA);
5475
0
                }
5476
0
              else
5477
0
                {
5478
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5479
0
                }
5480
0
              break;
5481
0
            case TLV_CMTS_MIC:
5482
0
              if (length == 16)
5483
0
                {
5484
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_cmts_mic, tvb,
5485
0
                                       pos, length, ENC_NA);
5486
0
                }
5487
0
              else
5488
0
                {
5489
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5490
0
                }
5491
0
              break;
5492
0
            case TLV_VENDOR_ID:
5493
0
              if (length == 3)
5494
0
                {
5495
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_vendor_id, tvb,
5496
0
                                       pos, length, ENC_BIG_ENDIAN);
5497
0
                }
5498
0
              else
5499
0
                {
5500
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5501
0
                }
5502
0
              break;
5503
0
            case TLV_SW_UPG_FILE:
5504
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_sw_file, tvb, pos,
5505
0
                                   length, ENC_ASCII);
5506
0
              break;
5507
0
            case TLV_SNMP_WRITE_CTRL:
5508
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_snmp_access, tvb,
5509
0
                                   pos, length, ENC_NA);
5510
0
              break;
5511
0
            case TLV_SNMP_OBJECT:
5512
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_snmp_obj, tvb,
5513
0
                                   pos, length, ENC_NA);
5514
0
              break;
5515
0
            case TLV_MODEM_IP:
5516
0
              if (length == 4)
5517
0
                {
5518
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_modem_addr,
5519
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5520
0
                }
5521
0
              else
5522
0
                {
5523
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5524
0
                }
5525
0
              break;
5526
0
            case TLV_SVC_UNAVAIL:
5527
0
              if (length == 3)
5528
0
                {
5529
0
                  dissect_svc_unavail(tvb, tlv_tree, pos, length);
5530
0
                }
5531
0
              else
5532
0
                {
5533
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5534
0
                }
5535
0
              break;
5536
0
            case TLV_ETHERNET_MAC:
5537
0
              if (length == 6)
5538
0
                {
5539
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_cpe_ethernet,
5540
0
                                       tvb, pos, length, ENC_NA);
5541
0
                }
5542
0
              else
5543
0
                {
5544
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5545
0
                }
5546
0
              break;
5547
0
            case TLV_TEL_SETTINGS:
5548
0
              break;
5549
0
            case TLV_BPI_CONFIG:
5550
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_bpi, tvb,
5551
0
                                   pos, length, ENC_NA);
5552
0
              break;
5553
0
            case TLV_MAX_CPES:
5554
0
              if (length == 1)
5555
0
                {
5556
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_max_cpe, tvb,
5557
0
                                       pos, length, ENC_BIG_ENDIAN);
5558
0
                }
5559
0
              else
5560
0
                {
5561
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5562
0
                }
5563
0
              break;
5564
0
            case TLV_TFTP_TIME:
5565
0
              if (length == 4)
5566
0
                {
5567
0
                  proto_tree_add_item (tlv_tree,
5568
0
                                       hf_docsis_tlv_tftp_server_timestamp,
5569
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5570
0
                }
5571
0
              else
5572
0
                {
5573
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5574
0
                }
5575
0
              break;
5576
0
            case TLV_TFTP_MODEM_ADDRESS:
5577
0
              if (length == 4)
5578
0
                {
5579
0
                  proto_tree_add_item (tlv_tree,
5580
0
                                       hf_docsis_tlv_tftp_prov_modem_address,
5581
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5582
0
                }
5583
0
              else
5584
0
                {
5585
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5586
0
                }
5587
0
              break;
5588
0
            case TLV_SW_UPG_SRVR:
5589
0
              if (length == 4)
5590
0
                {
5591
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_sw_upg_srvr,
5592
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5593
0
                }
5594
0
              else
5595
0
                {
5596
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5597
0
                }
5598
0
              break;
5599
0
            case TLV_UPSTREAM_CLASSIFIER:
5600
0
            case TLV_DOWN_CLASSIFIER:
5601
0
              dissect_classifiers (tvb, pinfo, tlv_tree, pos, length, type);
5602
0
              break;
5603
0
            case TLV_UPSTREAM_SERVICE_FLOW:
5604
0
            case TLV_DOWN_SERVICE_FLOW:
5605
0
              dissect_sflow (tvb, pinfo, tlv_tree, pos, length, type);
5606
0
              break;
5607
0
            case TLV_PHS:
5608
0
              dissect_phs (tvb, pinfo, tlv_tree, pos, length);
5609
0
              break;
5610
0
            case TLV_HMAC_DIGEST:
5611
0
              if (length == 20)
5612
0
                {
5613
0
                  proto_tree_add_item (tlv_tree,
5614
0
                                       hf_docsis_tlv_hmac_digest, tvb,
5615
0
                                       pos, length, ENC_NA);
5616
0
                }
5617
0
              else
5618
0
                {
5619
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5620
0
                }
5621
0
              break;
5622
0
            case TLV_MAX_CLASSIFIERS:
5623
0
              if (length == 2)
5624
0
                {
5625
0
                  proto_tree_add_item (tlv_tree,
5626
0
                                       hf_docsis_tlv_max_classifiers, tvb,
5627
0
                                       pos, length, ENC_BIG_ENDIAN);
5628
0
                }
5629
0
              else
5630
0
                {
5631
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5632
0
                }
5633
0
              break;
5634
0
            case TLV_PRIVACY_ENABLE:
5635
0
              if (length == 1)
5636
0
                {
5637
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_privacy_enable,
5638
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5639
0
                }
5640
0
              else
5641
0
                {
5642
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5643
0
                }
5644
0
              break;
5645
0
            case TLV_AUTH_BLOCK:
5646
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_auth_block,
5647
0
                                   tvb, pos, length, ENC_NA);
5648
0
              break;
5649
0
            case TLV_KEY_SEQ_NUM:
5650
0
              if (length == 1)
5651
0
                {
5652
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_key_seq_num, tvb,
5653
0
                                       pos, length, ENC_NA);
5654
0
                }
5655
0
              else
5656
0
                {
5657
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5658
0
                }
5659
0
              break;
5660
0
            case TLV_MFGR_CVC:
5661
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_mfgr_cvc,
5662
0
                                   tvb, pos, length, ENC_NA);
5663
0
              break;
5664
0
            case TLV_COSIGN_CVC:
5665
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_cosign_cvc,
5666
0
                                   tvb, pos, length, ENC_NA);
5667
0
              break;
5668
0
            case TLV_SNMPV3_KICKSTART:
5669
0
              dissect_snmpv3_kickstart(tvb, pinfo, tlv_tree, pos, length);
5670
0
              break;
5671
0
            case TLV_SUBS_MGMT_CTRL:
5672
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_subs_mgmt_ctrl,
5673
0
                                   tvb, pos, length, ENC_NA);
5674
0
              break;
5675
0
            case TLV_SUBS_MGMT_CPE:
5676
0
              if ((length % 4) == 0)
5677
0
                {
5678
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_subs_mgmt_ip_table,
5679
0
                                       tvb, pos, length, ENC_NA);
5680
0
                  for (x = 0; x < length; x+=4)
5681
0
                    {
5682
0
                      proto_tree_add_item (tlv_tree,
5683
0
                                           hf_docsis_tlv_subs_mgmt_ip_entry,
5684
0
                                           tvb, pos + x, 4, ENC_BIG_ENDIAN);
5685
0
                    }
5686
0
                }
5687
0
              else
5688
0
                {
5689
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5690
0
                }
5691
0
              break;
5692
0
            case TLV_SUBS_MGMT_FLTR:
5693
0
              proto_tree_add_item (tlv_tree,
5694
0
                                   hf_docsis_tlv_subs_mgmt_filter_grps,
5695
0
                                   tvb, pos, length, ENC_NA);
5696
0
              break;
5697
0
            case TLV_SNMPV3_NTFY_RCVR:
5698
0
              proto_tree_add_item(tlv_tree,
5699
0
                                  hf_docsis_tlv_snmpv3_ntfy_rcvr,
5700
0
                                  tvb, pos, length, ENC_NA);
5701
0
              break;
5702
0
            case TLV_ENABLE_20_MODE:
5703
0
              if (length == 1)
5704
0
                {
5705
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_enable_20_mode,
5706
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5707
0
                }
5708
0
              else
5709
0
                {
5710
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5711
0
                }
5712
0
              break;
5713
0
            case TLV_ENABLE_TEST_MODES:
5714
0
              if (length == 1)
5715
0
                {
5716
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_enable_test_modes,
5717
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5718
0
                }
5719
0
              else
5720
0
                {
5721
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5722
0
                }
5723
0
              break;
5724
0
            case TLV_DS_CH_LIST:
5725
0
              dissect_ds_ch_list(tvb, pinfo, tlv_tree, pos, length);
5726
0
              break;
5727
0
            case TLV_MC_MAC_ADDRESS:
5728
0
              if (length == 6)
5729
0
                {
5730
0
                  proto_tree_add_item(tlv_tree, hf_docsis_tlv_mc_mac_address,
5731
0
                                      tvb, pos, length, ENC_NA);
5732
0
                }
5733
0
              else
5734
0
                {
5735
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5736
0
                }
5737
0
              break;
5738
0
            case TLV_DOCSIS_EXTENSION_FIELD:
5739
0
              dissect_docsis_extension_field(tvb, pinfo, tlv_tree, pos, length);
5740
0
              break;
5741
0
            case TLV_VENDOR_SPEC:
5742
0
              dissect_vendor_specific_capabilities(tvb, pinfo, tlv_tree, pos, length);
5743
0
              break;
5744
0
            case TLV_DUT_FILTER:
5745
0
              dissect_dut_filter(tvb, pinfo, tlv_tree, pos, length);
5746
0
              break;
5747
0
            case TLV_TCC:
5748
0
              dissect_tcc(tvb, pinfo, tlv_tree, pos, length, &previous_channel_id);
5749
0
              break;
5750
0
            case TLV_SID_CL:
5751
0
              dissect_sid_cl(tvb, pinfo, tlv_tree, pos, length);
5752
0
              break;
5753
0
            case TLV_RCP:
5754
0
              dissect_rcp(tvb, pinfo, tlv_tree, pos, length);
5755
0
              break;
5756
0
            case TLV_RCC:
5757
0
              dissect_rcc(tvb, pinfo, tlv_tree, pos, length);
5758
0
              break;
5759
0
            case TLV_DSID:
5760
0
              dissect_dsid(tvb, pinfo, tlv_tree, pos, length);
5761
0
              break;
5762
0
            case TLV_SEC_ASSOC:
5763
0
              dissect_sec_assoc(tvb, pinfo, tlv_tree, pos, length);
5764
0
              break;
5765
0
            case TLV_INIT_CH_TIMEOUT:
5766
0
              if (length == 2)
5767
0
                {
5768
0
                  proto_tree_add_item(tlv_tree, hf_docsis_tlv_init_ch_timeout,
5769
0
                                      tvb, pos, length, ENC_BIG_ENDIAN);
5770
0
                }
5771
0
              else
5772
0
                {
5773
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5774
0
                }
5775
0
              break;
5776
0
            case TLV_CH_ASGN:
5777
0
              dissect_ch_asgn(tvb, pinfo, tlv_tree, pos, length);
5778
0
              break;
5779
0
            case TLV_CM_INIT_REASON:
5780
0
              if (length == 1)
5781
0
                {
5782
0
                  proto_tree_add_item(tlv_tree, hf_docsis_tlv_cm_init_reason,
5783
0
                                      tvb, pos, length, ENC_BIG_ENDIAN);
5784
0
                }
5785
0
              else
5786
0
                {
5787
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5788
0
                }
5789
0
              break;
5790
0
            case TLV_SW_UPG_SRVR_IPV6:
5791
0
              if (length == 16)
5792
0
                {
5793
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_sw_upg_srvr_ipv6,
5794
0
                                       tvb, pos, length, ENC_NA);
5795
0
                }
5796
0
              else
5797
0
                {
5798
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5799
0
                }
5800
0
              break;
5801
0
            case TLV_TFTP_PROV_CM_IPV6_ADDR:
5802
0
              if (length == 16)
5803
0
                {
5804
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_tftp_prov_cm_ipv6_addr,
5805
0
                                       tvb, pos, length, ENC_NA);
5806
0
                }
5807
0
              else
5808
0
                {
5809
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5810
0
                }
5811
0
              break;
5812
0
            case TLV_US_DROP_CLFY:
5813
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_us_drop_clfy,
5814
0
                                   tvb, pos, length, ENC_NA);
5815
0
              break;
5816
0
            case TLV_SUBS_MGMT_IPV6_LST:
5817
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_subs_mgmt_ipv6_lst,
5818
0
                                   tvb, pos, length, ENC_NA);
5819
0
              break;
5820
0
            case TLV_US_DROP_CLFY_GROUP_ID:
5821
0
              proto_tree_add_item (tlv_tree, hf_docsis_tlv_us_drop_clfy_group_id,
5822
0
                                   tvb, pos, length, ENC_NA);
5823
0
              break;
5824
0
            case TLV_SUBS_MGMT_CTRL_MAX_CPE_IPV6:
5825
0
              if (length == 2)
5826
0
                {
5827
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_subs_mgmt_ctrl_max_cpe_ipv6,
5828
0
                                       tvb, pos, length, ENC_BIG_ENDIAN);
5829
0
                }
5830
0
              else
5831
0
                {
5832
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5833
0
                }
5834
0
              break;
5835
0
            case TLV_CMTS_MC_SESS_ENC:
5836
0
              dissect_cmts_mc_sess_enc(tvb, pinfo, tlv_tree, pos, length);
5837
0
              break;
5838
0
            case TLV_EM_MODE_INDICATOR:
5839
0
              if (length == 1)
5840
0
                {
5841
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_em_mode_ind, tvb, pos, length, ENC_BIG_ENDIAN);
5842
0
                }
5843
0
              else
5844
0
                {
5845
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5846
0
                }
5847
0
              break;
5848
0
            case TLV_EM_ID_LIST_FOR_CM:
5849
0
              dissect_em_id_list_for_cm(tvb, tlv_tree, pos, length);
5850
0
              break;
5851
0
            case TLV_FDX_TG_ASSIGNMENT:
5852
0
              dissect_fdx_tg_assignment(tvb, pinfo, tlv_tree, pos, length);
5853
0
              break;
5854
0
            case TLV_FDX_RESET:
5855
0
              if (length == 1)
5856
0
                {
5857
0
                  proto_tree_add_item (tlv_tree, hf_docsis_tlv_fdx_reset, tvb, pos, length, ENC_BIG_ENDIAN);
5858
0
                }
5859
0
              else
5860
0
                {
5861
0
                  expert_add_info_format(pinfo, it, &ei_docsis_tlv_tlvlen_bad, "Wrong TLV length: %u", length);
5862
0
                }
5863
0
              break;
5864
0
            case TLV_END:
5865
0
              break;
5866
0
            default:
5867
0
              dissect_unknown_tlv (tvb, pinfo, tlv_tree, pos - 2, length + 2);
5868
0
              break;
5869
0
          }                     /* switch(type) */
5870
5871
0
        pos = pos + length;
5872
0
      }                         /* while (pos < total_len) */
5873
0
  }                             /* if (tree) */
5874
5875
0
  return tvb_captured_length(tvb);
5876
0
}
5877
5878
/* Register the protocol with Wireshark */
5879
void
5880
proto_register_docsis_tlv (void)
5881
15
{
5882
15
  static hf_register_info hf[] = {
5883
15
    {&hf_docsis_tlv_down_freq,
5884
15
     {"1 Downstream Frequency", "docsis_tlv.downfreq",
5885
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
5886
15
      NULL, HFILL}
5887
15
    },
5888
15
    {&hf_docsis_tlv_upstream_chid,
5889
15
     {"2 Upstream Channel ID", "docsis_tlv.upchid",
5890
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
5891
15
      "Service Identifier", HFILL}
5892
15
    },
5893
15
    {&hf_docsis_tlv_net_access,
5894
15
     {"3 Network Access", "docsis_tlv.netaccess",
5895
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
5896
15
      "Network Access TLV", HFILL}
5897
15
    },
5898
#if 0
5899
    {&hf_docsis_tlv_cos,
5900
     {"4 COS Encodings", "docsis_tlv.cos",
5901
      FT_BYTES, BASE_NONE, NULL, 0x0,
5902
      NULL, HFILL}
5903
    },
5904
#endif
5905
15
    {&hf_docsis_tlv_cos_id,
5906
15
     {".1 Class ID", "docsis_tlv.cos.id",
5907
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
5908
15
      NULL, HFILL}
5909
15
    },
5910
15
    {&hf_docsis_tlv_cos_sid,
5911
15
     {".2 Service ID", "docsis_tlv.cos.sid",
5912
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
5913
15
      NULL, HFILL}
5914
15
    },
5915
15
    {&hf_docsis_tlv_cos_max_down,
5916
15
     {".2 Max Downstream Rate (bps)", "docsis_tlv.cos.maxdown",
5917
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
5918
15
      NULL, HFILL}
5919
15
    },
5920
15
    {&hf_docsis_tlv_cos_max_up,
5921
15
     {".3 Max Upstream Rate (bps)", "docsis_tlv.cos.maxup",
5922
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
5923
15
      NULL, HFILL}
5924
15
    },
5925
15
    {&hf_docsis_tlv_cos_up_chnl_pri,
5926
15
     {".4 Upstream Channel Priority", "docsis_tlv.cos.upchnlpri",
5927
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
5928
15
      NULL, HFILL}
5929
15
    },
5930
15
    {&hf_docsis_tlv_cos_min_grntd_up,
5931
15
     {".5 Guaranteed Upstream Rate", "docsis_tlv.cos.mingrntdup",
5932
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
5933
15
      "Guaranteed Minimum Upstream Data Rate", HFILL}
5934
15
    },
5935
15
    {&hf_docsis_tlv_cos_max_up_burst,
5936
15
     {".6 Maximum Upstream Burst", "docsis_tlv.cos.maxupburst",
5937
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
5938
15
      NULL, HFILL}
5939
15
    },
5940
15
    {&hf_docsis_tlv_cos_privacy_enable,
5941
15
     {".7 COS Privacy Enable", "docsis_tlv.cos.privacy_enable",
5942
15
      FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
5943
15
      "Class of Service Privacy Enable", HFILL}
5944
15
    },
5945
#if 0
5946
    {&hf_docsis_tlv_mcap,
5947
     {"5 Modem Capabilities", "docsis_tlv.mcap",
5948
      FT_BYTES, BASE_NONE, NULL, 0x0,
5949
      NULL, HFILL}
5950
    },
5951
#endif
5952
15
    {&hf_docsis_tlv_mcap_concat,
5953
15
     {".1 Concatenation Support", "docsis_tlv.mcap.concat",
5954
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
5955
15
      NULL, HFILL}
5956
15
    },
5957
15
    {&hf_docsis_tlv_mcap_docs_ver,
5958
15
     {".2 Docsis Version", "docsis_tlv.map.docsver",
5959
15
      FT_UINT8, BASE_DEC, VALS (docs_ver_vals), 0x0,
5960
15
      NULL, HFILL}
5961
15
    },
5962
15
    {&hf_docsis_tlv_mcap_frag,
5963
15
     {".3 Fragmentation Support", "docsis_tlv.mcap.frag",
5964
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
5965
15
      NULL, HFILL}
5966
15
    },
5967
15
    {&hf_docsis_tlv_mcap_phs,
5968
15
     {".4 PHS Support", "docsis_tlv.mcap.phs",
5969
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
5970
15
      NULL, HFILL}
5971
15
    },
5972
15
    {&hf_docsis_tlv_mcap_igmp,
5973
15
     {".5 IGMP Support", "docsis_tlv.mcap.igmp",
5974
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
5975
15
      NULL, HFILL}
5976
15
    },
5977
15
    {&hf_docsis_tlv_mcap_privacy,
5978
15
     {".6 Privacy Support", "docsis_tlv.mcap.privacy",
5979
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
5980
15
      NULL, HFILL}
5981
15
    },
5982
15
    {&hf_docsis_tlv_mcap_down_said,
5983
15
     {".7 # Downstream SAIDs Supported", "docsis_tlv.mcap.downsaid",
5984
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
5985
15
      "Downstream Said Support", HFILL}
5986
15
    },
5987
15
    {&hf_docsis_tlv_mcap_up_sid,
5988
15
     {".8 # Upstream Service Flows Supported", "docsis_tlv.mcap.upsid",
5989
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
5990
15
      NULL, HFILL}
5991
15
    },
5992
15
    {&hf_docsis_tlv_mcap_8021P_filter,
5993
15
     {".9 802.1P Filtering Support", "docsis_tlv.mcap.dot1pfiltering",
5994
15
      FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x80,
5995
15
      NULL, HFILL}
5996
15
    },
5997
15
    {&hf_docsis_tlv_mcap_8021Q_filter,
5998
15
     {".9 802.1Q Filtering Support", "docsis_tlv.mcap.dot1qfilt",
5999
15
      FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x40,
6000
15
      NULL, HFILL}
6001
15
    },
6002
15
    {&hf_docsis_tlv_mcap_xmit_eq_taps_per_sym,
6003
15
     {".10 Xmit Equalizer Taps/Sym", "docsis_tlv.mcap.tapspersym",
6004
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6005
15
      "Transmit Equalizer Taps per Symbol", HFILL}
6006
15
    },
6007
15
    {&hf_docsis_tlv_mcap_xmit_eq_taps,
6008
15
     {".11 # Xmit Equalizer Taps", "docsis_tlv.mcap.numtaps",
6009
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6010
15
      "Number of Transmit Equalizer Taps", HFILL}
6011
15
    },
6012
15
    {&hf_docsis_tlv_mcap_dcc,
6013
15
     {".12 DCC Support", "docsis_tlv.mcap.dcc",
6014
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
6015
15
      NULL, HFILL}
6016
15
    },
6017
15
    {&hf_docsis_tlv_mcap_ip_filters,
6018
15
     {".13 IP Filters Support","docsis_tlv.mcap.ipfilters",
6019
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6020
15
      NULL, HFILL}
6021
15
    },
6022
15
    {&hf_docsis_tlv_mcap_llc_filters,
6023
15
     {".14 LLC Filters Support","docsis_tlv.mcap.llcfilters",
6024
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6025
15
      NULL, HFILL}
6026
15
    },
6027
15
    {&hf_docsis_tlv_mcap_exp_unicast_sid,
6028
15
     {".15 Expanded Unicast SID Space","docsis_tlv.mcap.exucsid",
6029
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
6030
15
      NULL, HFILL}
6031
15
    },
6032
15
    {&hf_docsis_tlv_mcap_rnghoff_cm,
6033
15
     {".16 Ranging Hold-Off (CM)","docsis_tlv.mcap.rnghoffcm",
6034
15
      FT_BOOLEAN, 32, TFS(&tfs_on_off), 0x00000001,
6035
15
      NULL, HFILL}
6036
15
    },
6037
15
    {&hf_docsis_tlv_mcap_rnghoff_erouter,
6038
15
     {".16 Ranging Hold-Off (ePS or eRouter)",
6039
15
      "docsis_tlv.mcap.rnghofferouter",
6040
15
      FT_BOOLEAN, 32, TFS(&tfs_on_off), 0x00000002,
6041
15
      NULL, HFILL}
6042
15
    },
6043
15
    {&hf_docsis_tlv_mcap_rnghoff_emta,
6044
15
     {".16 Ranging Hold-Off (eMTA or EDVA)",
6045
15
      "docsis_tlv.mcap.rnghoffemta",
6046
15
      FT_BOOLEAN, 32, TFS(&tfs_on_off), 0x00000004,
6047
15
      NULL, HFILL}
6048
15
    },
6049
15
    {&hf_docsis_tlv_mcap_rnghoff_estb,
6050
15
     {".16 Ranging Hold-Off (DSG/eSTB)",
6051
15
      "docsis_tlv.mcap.rnghoffestb",
6052
15
      FT_BOOLEAN, 32, TFS(&tfs_on_off), 0x00000008,
6053
15
      NULL, HFILL}
6054
15
    },
6055
15
    {&hf_docsis_tlv_mcap_l2vpn,
6056
15
     {".17 L2VPN Capability","docsis_tlv.mcap.l2vpn",
6057
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6058
15
      NULL, HFILL}
6059
15
    },
6060
15
    {&hf_docsis_tlv_mcap_l2vpn_esafe,
6061
15
     {".18 L2VPN eSAFE Host Capability","docsis_tlv.mcap.l2vpnesafe",
6062
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6063
15
      NULL, HFILL}
6064
15
    },
6065
15
    {&hf_docsis_tlv_mcap_dut_filtering,
6066
15
     {".19 Downstream Unencrypted Traffic (DUT) Filtering",
6067
15
      "docsis_tlv.mcap.dut",
6068
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6069
15
      NULL, HFILL}
6070
15
    },
6071
15
    {&hf_docsis_tlv_mcap_us_freq_range,
6072
15
     {".20 Upstream Frequency Range Support",
6073
15
      "docsis_tlv.mcap.usfreqrng",
6074
15
      FT_UINT8, BASE_DEC, VALS (docsis_freq_rng_vals), 0x0,
6075
15
      NULL, HFILL}
6076
15
    },
6077
15
    {&hf_docsis_tlv_mcap_us_srate_160,
6078
15
     {".21 Upstream Symbol Rate 160ksps supported",
6079
15
      "docsis_tlv.mcap.srate160",
6080
15
      FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x01,
6081
15
      NULL, HFILL}
6082
15
    },
6083
15
    {&hf_docsis_tlv_mcap_us_srate_320,
6084
15
     {".21 Upstream Symbol Rate 320ksps supported",
6085
15
      "docsis_tlv.mcap.srate320",
6086
15
      FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x02,
6087
15
      NULL, HFILL}
6088
15
    },
6089
15
    {&hf_docsis_tlv_mcap_us_srate_640,
6090
15
     {".21 Upstream Symbol Rate 640ksps supported",
6091
15
      "docsis_tlv.mcap.srate640",
6092
15
      FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x04,
6093
15
      NULL, HFILL}
6094
15
    },
6095
15
    {&hf_docsis_tlv_mcap_us_srate_1280,
6096
15
     {".21 Upstream Symbol Rate 1280ksps supported",
6097
15
      "docsis_tlv.mcap.srate1280",
6098
15
      FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x08,
6099
15
      NULL, HFILL}
6100
15
    },
6101
15
    {&hf_docsis_tlv_mcap_us_srate_2560,
6102
15
     {".21 Upstream Symbol Rate 2560ksps supported",
6103
15
      "docsis_tlv.mcap.srate2560",
6104
15
      FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x10,
6105
15
      NULL, HFILL}
6106
15
    },
6107
15
    {&hf_docsis_tlv_mcap_us_srate_5120,
6108
15
     {".21 Upstream Symbol Rate 5120ksps supported",
6109
15
      "docsis_tlv.mcap.srate5120",
6110
15
      FT_BOOLEAN, 8, TFS(&tfs_on_off), 0x20,
6111
15
      NULL, HFILL}
6112
15
    },
6113
15
    {&hf_docsis_tlv_mcap_sac,
6114
15
     {".22 Selectable Active Code Mode 2 Support","docsis_tlv.mcap.sac",
6115
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
6116
15
      NULL, HFILL}
6117
15
    },
6118
15
    {&hf_docsis_tlv_mcap_code_hop_mode2,
6119
15
     {".23 Code Hopping Mode 2 Support","docsis_tlv.mcap.codehopm2",
6120
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
6121
15
      NULL, HFILL}
6122
15
    },
6123
15
    {&hf_docsis_tlv_mcap_mtc,
6124
15
     {".24 Multiple Transmit Channel Support","docsis_tlv.mcap.mtc",
6125
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6126
15
      NULL, HFILL}
6127
15
    },
6128
15
    {&hf_docsis_tlv_mcap_512_msps_utc,
6129
15
     {".25 5.12 Msps Upstream Transmit Channel Support",
6130
15
      "docsis_tlv.mcap.512mspsutc",
6131
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6132
15
      NULL, HFILL}
6133
15
    },
6134
15
    {&hf_docsis_tlv_mcap_256_msps_utc,
6135
15
     {".26 2.56 Msps Upstream Transmit Channel Support",
6136
15
      "docsis_tlv.mcap.256mspsutc",
6137
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6138
15
      NULL, HFILL}
6139
15
    },
6140
15
    {&hf_docsis_tlv_mcap_total_sid_cluster,
6141
15
     {".27 Total SID Cluster Support","docsis_tlv.mcap.totalsidcl",
6142
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6143
15
      NULL, HFILL}
6144
15
    },
6145
15
    {&hf_docsis_tlv_mcap_sid_per_sf,
6146
15
     {".28 SID Clusters per Service Flow Support",
6147
15
      "docsis_tlv.mcap.sidpersf",
6148
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6149
15
      NULL, HFILL}
6150
15
    },
6151
15
    {&hf_docsis_tlv_mcap_mrc,
6152
15
     {".29 Multiple Receive Channel Support","docsis_tlv.mcap.mrc",
6153
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6154
15
      NULL, HFILL}
6155
15
    },
6156
15
    {&hf_docsis_tlv_mcap_total_dsid,
6157
15
     {".30 Total Downstream Service ID (DSID) Support",
6158
15
      "docsis_tlv.mcap.totaldsid",
6159
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6160
15
      NULL, HFILL}
6161
15
    },
6162
15
    {&hf_docsis_tlv_mcap_reseq_dsid,
6163
15
     {".31 Resequencing Downstream Service ID (DSID) Support",
6164
15
      "docsis_tlv.mcap.reseqdsid",
6165
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6166
15
      NULL, HFILL}
6167
15
    },
6168
15
    {&hf_docsis_tlv_mcap_mc_dsid,
6169
15
     {".32 Multicast Downstream Service ID (DSID) Support",
6170
15
      "docsis_tlv.mcap.mcdsid",
6171
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6172
15
      NULL, HFILL}
6173
15
    },
6174
15
    {&hf_docsis_tlv_mcap_mc_dsid_fwd,
6175
15
     {".33 Multicast DSID Forwarding","docsis_tlv.mcap.mcdsidfwd",
6176
15
      FT_UINT8, BASE_DEC, VALS (mc_dsid_fwd_vals), 0x0,
6177
15
      NULL, HFILL}
6178
15
    },
6179
15
    {&hf_docsis_tlv_mcap_fctype_fwd,
6180
15
     {".34 Frame Control Type Forwarding Capability",
6181
15
      "docsis_tlv.mcap.fctypefwd",
6182
15
      FT_UINT8, BASE_DEC, VALS (fctype_fwd_vals), 0x0,
6183
15
      NULL, HFILL}
6184
15
    },
6185
15
    {&hf_docsis_tlv_mcap_dpv_path,
6186
15
     {".35 DPV Capability (per Path)","docsis_tlv.mcap.dpvpath",
6187
15
      FT_UINT8, BASE_DEC, NULL, 0x1,
6188
15
      NULL, HFILL}
6189
15
    },
6190
15
    {&hf_docsis_tlv_mcap_dpv_packet,
6191
15
     {".35 DPV Capability (per Packet)","docsis_tlv.mcap.dpvpacket",
6192
15
      FT_UINT8, BASE_DEC, NULL, 0x2,
6193
15
      NULL, HFILL}
6194
15
    },
6195
15
    {&hf_docsis_tlv_mcap_ugs,
6196
15
     {".36 Unsolicited Grant Service Support","docsis_tlv.mcap.ugs",
6197
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6198
15
      NULL, HFILL}
6199
15
    },
6200
15
    {&hf_docsis_tlv_mcap_map_ucd,
6201
15
     {".37 MAP and UCD Receipt Support","docsis_tlv.mcap.mapucd",
6202
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
6203
15
      NULL, HFILL}
6204
15
    },
6205
15
    {&hf_docsis_tlv_mcap_udc,
6206
15
     {".38 Upstream Drop Classifier Support","docsis_tlv.mcap.udc",
6207
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6208
15
      NULL, HFILL}
6209
15
    },
6210
15
    {&hf_docsis_tlv_mcap_ipv6,
6211
15
     {".39 IPv6 Support","docsis_tlv.mcap.ipv6",
6212
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_on_off), 0x0,
6213
15
      NULL, HFILL}
6214
15
    },
6215
15
    {&hf_docsis_tlv_mcap_ext_us_trans_power,
6216
15
     {".40 Extended Upstream Transmit Power Capability",
6217
15
      "docsis_tlv.mcap.extustrpwr",
6218
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6219
15
      NULL, HFILL}
6220
15
    },
6221
15
    {&hf_docsis_tlv_mcap_em,
6222
15
     {".44 Energy Management Capabilities", "docsis_tlv.mcap.em",
6223
15
      FT_UINT32, BASE_HEX, NULL, 0x0,
6224
15
      NULL, HFILL}
6225
15
    },
6226
15
    {&hf_docsis_tlv_mcap_em_1x1,
6227
15
     {"Energy Management 1x1 Feature",
6228
15
      "docsis_tlv.mcap.em.1x1",
6229
15
      FT_BOOLEAN, 32, TFS (&sup_unsup_tfs), 0x1,
6230
15
      NULL, HFILL}
6231
15
    },
6232
15
    {&hf_docsis_tlv_mcap_em_light_sleep,
6233
15
     {"DOCSIS Light Sleep Mode",
6234
15
      "docsis_tlv.mcap.em.light_sleep",
6235
15
      FT_BOOLEAN, 32, TFS (&sup_unsup_tfs), 0x2,
6236
15
      NULL, HFILL}
6237
15
    },
6238
15
    {&hf_docsis_tlv_mcap_cm_status_ack,
6239
15
     {".46 CM-STATUS_ACK",
6240
15
      "docsis_tlv.mcap.cm_status_ack",
6241
15
      FT_UINT8, BASE_DEC, VALS(sup_unsup_vals), 0x0,
6242
15
      NULL, HFILL}
6243
15
    },
6244
15
    {&hf_docsis_tlv_mcap_em_pref,
6245
15
     {".47 Energy Management Preference",
6246
15
      "docsis_tlv.mcap.em_pref",
6247
15
      FT_UINT32, BASE_HEX, NULL, 0x0,
6248
15
      NULL, HFILL}
6249
15
    },
6250
15
    {&hf_docsis_tlv_mcap_em_pref_1x1,
6251
15
     {"Energy Management 1x1 Feature",
6252
15
      "docsis_tlv.mcap.em_pref.1x1",
6253
15
      FT_BOOLEAN, 32, NULL, 0x1,
6254
15
      NULL, HFILL}
6255
15
    },
6256
15
    {&hf_docsis_tlv_mcap_em_pref_dls,
6257
15
     {"DOCSIS Light Sleep Mode",
6258
15
      "docsis_tlv.mcap.em_pref.dls",
6259
15
      FT_BOOLEAN, 32, NULL, 0x2,
6260
15
      NULL, HFILL}
6261
15
    },
6262
15
    {&hf_docsis_tlv_mcap_ext_pkt_len_sup_cap,
6263
15
     {".48 Extended Packet Length Support Capability",
6264
15
      "docsis_tlv.mcap.ext_pkt_len_sup_cap",
6265
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6266
15
      NULL, HFILL}
6267
15
    },
6268
15
    {&hf_docsis_tlv_mcap_ofdm_mult_recv_chan_sup,
6269
15
     {".49 OFDM Multiple Receive Channel Support",
6270
15
      "docsis_tlv.mcap.ofdm_mult_recv_chan_sup",
6271
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6272
15
      NULL, HFILL}
6273
15
    },
6274
15
    {&hf_docsis_tlv_mcap_ofdma_mult_trans_chan_sup,
6275
15
     {".50 OFDMA Multiple Transmit Channel Support",
6276
15
      "docsis_tlv.mcap.ofdma_mult_trans_chan_sup",
6277
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6278
15
      NULL, HFILL}
6279
15
    },
6280
15
    {&hf_docsis_tlv_mcap_down_ofdm_prof_sup,
6281
15
     {".51 Downstream OFDM Profile Support",
6282
15
      "docsis_tlv.mcap.down_ofdm_prof_sup",
6283
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6284
15
      NULL, HFILL}
6285
15
    },
6286
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup,
6287
15
     {".52 Downstream OFDM channel subcarrier QAM modulation support",
6288
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup",
6289
15
      FT_UINT16, BASE_HEX, NULL, 0x0,
6290
15
      NULL, HFILL}
6291
15
    },
6292
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_reserved,
6293
15
     {"Reserved",
6294
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.reserved",
6295
15
      FT_BOOLEAN, 16, NULL, 0x802B,
6296
15
      NULL, HFILL}
6297
15
    },
6298
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_qpsk,
6299
15
     {"QPSK",
6300
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.qpsk",
6301
15
      FT_BOOLEAN, 16, NULL, 0x0004,
6302
15
      NULL, HFILL}
6303
15
    },
6304
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16qam,
6305
15
     {"16-QAM",
6306
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.16qam",
6307
15
      FT_BOOLEAN, 16, NULL, 0x0010,
6308
15
      NULL, HFILL}
6309
15
    },
6310
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_64qam,
6311
15
     {"64-QAM",
6312
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.64qam",
6313
15
      FT_BOOLEAN, 16, NULL, 0x0040,
6314
15
      NULL, HFILL}
6315
15
    },
6316
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_128qam,
6317
15
     {"128-QAM",
6318
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.128qam",
6319
15
      FT_BOOLEAN, 16, NULL, 0x0080,
6320
15
      NULL, HFILL}
6321
15
    },
6322
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_256qam,
6323
15
     {"256-QAM",
6324
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.256qam",
6325
15
      FT_BOOLEAN, 16, NULL, 0x0100,
6326
15
      NULL, HFILL}
6327
15
    },
6328
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_512qam,
6329
15
     {"512-QAM",
6330
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.512qam",
6331
15
      FT_BOOLEAN, 16, NULL, 0x0200,
6332
15
      NULL, HFILL}
6333
15
    },
6334
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_1024qam,
6335
15
     {"1024-QAM",
6336
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.1024qam",
6337
15
      FT_BOOLEAN, 16, NULL, 0x0400,
6338
15
      NULL, HFILL}
6339
15
    },
6340
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_2048qam,
6341
15
     {"2048-QAM",
6342
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.2048qam",
6343
15
      FT_BOOLEAN, 16, NULL, 0x0800,
6344
15
      NULL, HFILL}
6345
15
    },
6346
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_4096qam,
6347
15
     {"4096-QAM",
6348
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.4096qam",
6349
15
      FT_BOOLEAN, 16, NULL, 0x1000,
6350
15
      NULL, HFILL}
6351
15
    },
6352
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_8192qam,
6353
15
     {"8192-QAM",
6354
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.8192qam",
6355
15
      FT_BOOLEAN, 16, NULL, 0x2000,
6356
15
      NULL, HFILL}
6357
15
    },
6358
15
    {&hf_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup_16384qam,
6359
15
     {"16384-QAM",
6360
15
      "docsis_tlv.mcap.down_ofdm_chan_subc_qam_mod_sup.16384qam",
6361
15
      FT_BOOLEAN, 16, NULL, 0x4000,
6362
15
      NULL, HFILL}
6363
15
    },
6364
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup,
6365
15
     {".53 Upstream OFDMA channel subcarrier QAM modulation support",
6366
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup",
6367
15
      FT_UINT16, BASE_HEX, NULL, 0x0,
6368
15
      NULL, HFILL}
6369
15
    },
6370
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_reserved,
6371
15
     {"Reserved",
6372
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.reserved",
6373
15
      FT_BOOLEAN, 16, NULL, 0x8003,
6374
15
      NULL, HFILL}
6375
15
    },
6376
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_qpsk,
6377
15
     {"QPSK",
6378
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.qpsk",
6379
15
      FT_BOOLEAN, 16, NULL, 0x0004,
6380
15
      NULL, HFILL}
6381
15
    },
6382
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8qam,
6383
15
     {"8-QAM",
6384
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.8qam",
6385
15
      FT_BOOLEAN, 16, NULL, 0x0008,
6386
15
      NULL, HFILL}
6387
15
    },
6388
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16qam,
6389
15
     {"16-QAM",
6390
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.16qam",
6391
15
      FT_BOOLEAN, 16, NULL, 0x0010,
6392
15
      NULL, HFILL}
6393
15
    },
6394
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_32qam,
6395
15
     {"32-QAM",
6396
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.32qam",
6397
15
      FT_BOOLEAN, 16, NULL, 0x0020,
6398
15
      NULL, HFILL}
6399
15
    },
6400
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_64qam,
6401
15
     {"64-QAM",
6402
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.64qam",
6403
15
      FT_BOOLEAN, 16, NULL, 0x0040,
6404
15
      NULL, HFILL}
6405
15
    },
6406
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_128qam,
6407
15
     {"128-QAM",
6408
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.128qam",
6409
15
      FT_BOOLEAN, 16, NULL, 0x0080,
6410
15
      NULL, HFILL}
6411
15
    },
6412
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_256qam,
6413
15
     {"256-QAM",
6414
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.256qam",
6415
15
      FT_BOOLEAN, 16, NULL, 0x0100,
6416
15
      NULL, HFILL}
6417
15
    },
6418
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_512qam,
6419
15
     {"512-QAM",
6420
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.512qam",
6421
15
      FT_BOOLEAN, 16, NULL, 0x0200,
6422
15
      NULL, HFILL}
6423
15
    },
6424
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_1024qam,
6425
15
     {"1024-QAM",
6426
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.1024qam",
6427
15
      FT_BOOLEAN, 16, NULL, 0x0400,
6428
15
      NULL, HFILL}
6429
15
    },
6430
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_2048qam,
6431
15
     {"2048-QAM",
6432
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.2048qam",
6433
15
      FT_BOOLEAN, 16, NULL, 0x0800,
6434
15
      NULL, HFILL}
6435
15
    },
6436
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_4096qam,
6437
15
     {"4096-QAM",
6438
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.4096qam",
6439
15
      FT_BOOLEAN, 16, NULL, 0x1000,
6440
15
      NULL, HFILL}
6441
15
    },
6442
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_8192qam,
6443
15
     {"8192-QAM",
6444
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.8192qam",
6445
15
      FT_BOOLEAN, 16, NULL, 0x2000,
6446
15
      NULL, HFILL}
6447
15
    },
6448
15
    {&hf_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup_16384qam,
6449
15
     {"16384-QAM",
6450
15
      "docsis_tlv.mcap.up_ofdma_chan_subc_qam_mod_sup.16384qam",
6451
15
      FT_BOOLEAN, 16, NULL, 0x4000,
6452
15
      NULL, HFILL}
6453
15
    },
6454
15
    {&hf_docsis_tlv_mcap_down_lower_band_edge_conf,
6455
15
     {".54 Downstream Lower Band Edge Configuration",
6456
15
      "docsis_tlv.mcap.down_lower_band_edge_conf",
6457
15
      FT_UINT8, BASE_HEX, NULL, 0x0,
6458
15
      NULL, HFILL}
6459
15
    },
6460
15
    {&hf_docsis_tlv_mcap_down_lower_band_edge_conf_108,
6461
15
     {"Downstream Frequency Range starting from 108 MHz",
6462
15
      "docsis_tlv.mcap.down_lower_band_edge_conf.108mhz",
6463
15
      FT_BOOLEAN, 8, NULL, 0x01,
6464
15
      NULL, HFILL}
6465
15
    },
6466
15
    {&hf_docsis_tlv_mcap_down_lower_band_edge_conf_258,
6467
15
     {"Downstream Frequency Range starting from 258 MHz",
6468
15
      "docsis_tlv.mcap.down_lower_band_edge_conf.258mhz",
6469
15
      FT_BOOLEAN, 8, NULL, 0x02,
6470
15
      NULL, HFILL}
6471
15
    },
6472
15
    {&hf_docsis_tlv_mcap_down_upper_band_edge_conf,
6473
15
     {".55 Downstream Upper Band Edge Configuration",
6474
15
      "docsis_tlv.mcap.down_upper_band_edge_conf",
6475
15
      FT_UINT8, BASE_HEX, NULL, 0x0,
6476
15
      NULL, HFILL}
6477
15
    },
6478
15
    {&hf_docsis_tlv_mcap_down_upper_band_edge_conf_1218,
6479
15
     {"Downstream Frequency Range up to 1218 MHz",
6480
15
      "docsis_tlv.mcap.down_upper_band_edge_conf.1218mhz",
6481
15
      FT_BOOLEAN, 8, NULL, 0x01,
6482
15
      NULL, HFILL}
6483
15
    },
6484
15
    {&hf_docsis_tlv_mcap_down_upper_band_edge_conf_1794,
6485
15
     {"Downstream Frequency Range up to 1794 MHz",
6486
15
      "docsis_tlv.mcap.down_upper_band_edge_conf.1794mhz",
6487
15
      FT_BOOLEAN, 8, NULL, 0x02,
6488
15
      NULL, HFILL}
6489
15
    },
6490
15
    {&hf_docsis_tlv_mcap_down_upper_band_edge_conf_1002,
6491
15
     {"Downstream Frequency Range up to 1002 MHz",
6492
15
      "docsis_tlv.mcap.down_upper_band_edge_conf.1002mhz",
6493
15
      FT_BOOLEAN, 8, NULL, 0x04,
6494
15
      NULL, HFILL}
6495
15
    },
6496
15
    {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_conf,
6497
15
     {".56 Diplexer Upstream Upper Band Edge Configuration",
6498
15
      "docsis_tlv.mcap.dipl_up_upper_band_edge_conf",
6499
15
      FT_UINT8, BASE_DEC, VALS(dipl_up_upper_band_edge_conf_vals), 0x0,
6500
15
      NULL, HFILL}
6501
15
    },
6502
15
    {&hf_docsis_tlv_mcap_docsis_time_prot_mode,
6503
15
     {".57 DOCSIS Time Protocol Mode",
6504
15
      "docsis_tlv.mcap.docsis_time_prot_mode",
6505
15
      FT_UINT8, BASE_DEC, VALS(docsis_time_prot_mode_vals), 0x0,
6506
15
      NULL, HFILL}
6507
15
    },
6508
15
    {&hf_docsis_tlv_mcap_docsis_time_prot_perf_sup,
6509
15
     {".58 DOCSIS Time Protocol Performance Support",
6510
15
      "docsis_tlv.mcap.docsis_time_prot_perf_sup",
6511
15
      FT_UINT8, BASE_DEC, VALS(docsis_time_prot_perf_sup_vals), 0x0,
6512
15
      NULL, HFILL}
6513
15
    },
6514
15
    {&hf_docsis_tlv_mcap_pmax,
6515
15
     {".59 Pmax",
6516
15
      "docsis_tlv.mcap.pmax",
6517
15
      FT_UINT16, BASE_CUSTOM, CF_FUNC(fourth_dbmv), 0x0,
6518
15
      NULL, HFILL}
6519
15
    },
6520
15
    {&hf_docsis_tlv_mcap_dipl_down_lower_band_edge,
6521
15
     {".60 Diplexer Downstream Lower Band Edge",
6522
15
      "docsis_tlv.mcap.dipl_down_lower_band_edge",
6523
15
      FT_UINT8, BASE_HEX, NULL, 0x0,
6524
15
      NULL, HFILL}
6525
15
    },
6526
15
    {&hf_docsis_tlv_mcap_dipl_down_lower_band_edge_108,
6527
15
     {"Downstream Frequency Range starting from 108 MHz",
6528
15
      "docsis_tlv.mcap.dipl_down_lower_band_edge.108mhz",
6529
15
      FT_BOOLEAN, 8, NULL, 0x01,
6530
15
      NULL, HFILL}
6531
15
    },
6532
15
    {&hf_docsis_tlv_mcap_dipl_down_lower_band_edge_258,
6533
15
     {"Downstream Frequency Range starting from 258 MHz",
6534
15
      "docsis_tlv.mcap.dipl_down_lower_band_edge.258mhz",
6535
15
      FT_BOOLEAN, 8, NULL, 0x02,
6536
15
      NULL, HFILL}
6537
15
    },
6538
15
    {&hf_docsis_tlv_mcap_dipl_down_upper_band_edge,
6539
15
     {".61 Diplexer Downstream Upper Band Edge",
6540
15
      "docsis_tlv.mcap.dipl_down_upper_band_edge",
6541
15
      FT_UINT8, BASE_HEX, NULL, 0x0,
6542
15
      NULL, HFILL}
6543
15
    },
6544
15
    {&hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1218,
6545
15
     {"Downstream Frequency Range up to 1218 MHz",
6546
15
      "docsis_tlv.mcap.dipl_down_upper_band_edge.1218mhz",
6547
15
      FT_BOOLEAN, 8, NULL, 0x01,
6548
15
      NULL, HFILL}
6549
15
    },
6550
15
    {&hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1794,
6551
15
     {"Downstream Frequency Range up to 1794 MHz",
6552
15
      "docsis_tlv.mcap.dipl_down_upper_band_edge.1794mhz",
6553
15
      FT_BOOLEAN, 8, NULL, 0x02,
6554
15
      NULL, HFILL}
6555
15
    },
6556
15
    {&hf_docsis_tlv_mcap_dipl_down_upper_band_edge_1002,
6557
15
     {"Downstream Frequency Range up to 1002 MHz",
6558
15
      "docsis_tlv.mcap.dipl_down_upper_band_edge.1002mhz",
6559
15
      FT_BOOLEAN, 8, NULL, 0x04,
6560
15
      NULL, HFILL}
6561
15
    },
6562
15
    {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge,
6563
15
     {".62 Diplexer Upstream Upper Band Edge",
6564
15
      "docsis_tlv.mcap.dipl_up_upper_band_edge",
6565
15
      FT_UINT8, BASE_HEX, NULL, 0x0,
6566
15
      NULL, HFILL}
6567
15
    },
6568
15
    {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_42,
6569
15
     {"Upstream Frequency Range up to 42 MHz",
6570
15
      "docsis_tlv.mcap.dipl_up_upper_band_edge.42mhz",
6571
15
      FT_BOOLEAN, 8, NULL, 0x01,
6572
15
      NULL, HFILL}
6573
15
    },
6574
15
    {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_65,
6575
15
     {"Upstream Frequency Range up to 65 MHz",
6576
15
      "docsis_tlv.mcap.dipl_up_upper_band_edge.65mhz",
6577
15
      FT_BOOLEAN, 8, NULL, 0x02,
6578
15
      NULL, HFILL}
6579
15
    },
6580
15
    {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_85,
6581
15
     {"Upstream Frequency Range up to 85 MHz",
6582
15
      "docsis_tlv.mcap.dipl_up_upper_band_edge.85mhz",
6583
15
      FT_BOOLEAN, 8, NULL, 0x04,
6584
15
      NULL, HFILL}
6585
15
    },
6586
15
    {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_117,
6587
15
     {"Upstream Frequency Range up to 117 MHz",
6588
15
      "docsis_tlv.mcap.dipl_up_upper_band_edge.117mhz",
6589
15
      FT_BOOLEAN, 8, NULL, 0x08,
6590
15
      NULL, HFILL}
6591
15
    },
6592
15
    {&hf_docsis_tlv_mcap_dipl_up_upper_band_edge_204,
6593
15
     {"Upstream Frequency Range up to 204 MHz",
6594
15
      "docsis_tlv.mcap.dipl_up_upper_band_edge.204mhz",
6595
15
      FT_BOOLEAN, 8, NULL, 0x10,
6596
15
      NULL, HFILL}
6597
15
    },
6598
15
    {&hf_docsis_tlv_mcap_advanced_band_plan,
6599
15
     {".63 Advanced Band Plan",
6600
15
      "docsis_tlv.mcap.advanced_band_plan",
6601
15
      FT_UINT8, BASE_HEX, NULL, 0x0,
6602
15
      NULL, HFILL}
6603
15
    },
6604
15
    {&hf_docsis_tlv_mcap_advanced_band_plan_fdx_l,
6605
15
     {"FDX-L support",
6606
15
      "docsis_tlv.mcap.advanced_band_plan.fdx_l",
6607
15
      FT_BOOLEAN, 8, NULL, 0x01,
6608
15
      NULL, HFILL}
6609
15
    },
6610
15
    {&hf_docsis_tlv_mcap_advanced_band_plan_fdx,
6611
15
     {"FDX support",
6612
15
      "docsis_tlv.mcap.advanced_band_plan.fdx",
6613
15
      FT_BOOLEAN, 8, NULL, 0x02,
6614
15
      NULL, HFILL}
6615
15
    },
6616
15
    {&hf_docsis_tlv_mcap_advanced_band_plan_fdd,
6617
15
     {"FDD support",
6618
15
      "docsis_tlv.mcap.advanced_band_plan.fdd",
6619
15
      FT_BOOLEAN, 8, NULL, 0x04,
6620
15
      NULL, HFILL}
6621
15
    },
6622
15
    {&hf_docsis_tlv_mcap_advanced_band_plan_reserved,
6623
15
     {"Reserved",
6624
15
      "docsis_tlv.mcap.advanced_band_plan.reserved",
6625
15
      FT_BOOLEAN, 8, NULL, 0xF8,
6626
15
      NULL, HFILL}
6627
15
    },
6628
15
    {&hf_docsis_tlv_mcap_ext_sf_cluster_assign_sup,
6629
15
     {".74 Extended Service Flow SID Cluster Assignments Support",
6630
15
      "docsis_tlv.mcap.ext_sf_cluster_assign_sup",
6631
15
      FT_UINT8, BASE_DEC, VALS(docsis_mcap_ext_sf_cluster_assign_sup_vals), 0x0,
6632
15
      "The ability of CM to handle TLV 89", HFILL}
6633
15
    },
6634
15
    {&hf_docsis_tlv_mcap_low_latency_sup,
6635
15
     {".76 Low Latency Support",
6636
15
      "docsis_tlv.mcap.low_latency_sup",
6637
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6638
15
      NULL, HFILL}
6639
15
    },
6640
15
    {&hf_docsis_tlv_mcap_adv_down_lower_band_edge_conf,
6641
15
     {".79 Advanced Downstream Lower Band Edge Configuration",
6642
15
      "docsis_tlv.mcap.adv_down_lower_band_edge_conf",
6643
15
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mhz), 0x0,
6644
15
      NULL, HFILL}
6645
15
    },
6646
15
    {&hf_docsis_tlv_mcap_adv_down_upper_band_edge_conf,
6647
15
     {".80 Advanced Downstream Upper Band Edge Configuration",
6648
15
      "docsis_tlv.mcap.adv_down_upper_band_edge_conf",
6649
15
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mhz), 0x0,
6650
15
      NULL, HFILL}
6651
15
    },
6652
15
    {&hf_docsis_tlv_mcap_adv_up_upper_band_edge_conf,
6653
15
     {".81 Advanced Upstream Upper Band Edge Configuration",
6654
15
      "docsis_tlv.mcap.adv_up_upper_band_edge_conf",
6655
15
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mhz), 0x0,
6656
15
      NULL, HFILL}
6657
15
    },
6658
15
    {&hf_docsis_tlv_mcap_adv_down_lower_band_edge_option,
6659
15
     {"Advanced Diplexer Downstream Lower Band Edge Option",
6660
15
      "docsis_tlv.mcap.adv_down_lower_band_edge_option",
6661
15
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mhz), 0x0,
6662
15
      NULL, HFILL}
6663
15
    },
6664
15
    {&hf_docsis_tlv_mcap_adv_down_upper_band_edge_option,
6665
15
     {"Advanced Diplexer Downstream Upper Band Edge Option",
6666
15
      "docsis_tlv.mcap.adv_down_upper_band_edge_option",
6667
15
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mhz), 0x0,
6668
15
      NULL, HFILL}
6669
15
    },
6670
15
    {&hf_docsis_tlv_mcap_adv_up_upper_band_edge_option,
6671
15
     {"Advanced Diplexer Upstream Upper Band Edge Option",
6672
15
      "docsis_tlv.mcap.adv_up_upper_band_edge_option",
6673
15
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mhz), 0x0,
6674
15
      NULL, HFILL}
6675
15
    },
6676
15
    {&hf_docsis_tlv_mcap_extended_power_options,
6677
15
     {".85 Extended Power Options",
6678
15
      "docsis_tlv.mcap.extended_power_options",
6679
15
      FT_UINT8, BASE_DEC, VALS(extended_power_options_vals), 0x0,
6680
15
      NULL, HFILL}
6681
15
    },
6682
15
    {&hf_docsis_tlv_cm_mic,
6683
15
     {"6 CM MIC", "docsis_tlv.cmmic",
6684
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6685
15
      "Cable Modem Message Integrity Check", HFILL}
6686
15
    },
6687
15
    {&hf_docsis_tlv_cmts_mic,
6688
15
     {"7 CMTS MIC", "docsis_tlv.cmtsmic",
6689
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6690
15
      "CMTS Message Integrity Check", HFILL}
6691
15
    },
6692
15
    {&hf_docsis_tlv_vendor_id,
6693
15
     {"8 Vendor ID", "docsis_tlv.vendorid",
6694
15
      FT_UINT24, BASE_OUI, NULL, 0x0,
6695
15
      "Vendor Identifier", HFILL}
6696
15
    },
6697
15
    {&hf_docsis_tlv_sw_file,
6698
15
     {"9 Software Upgrade File", "docsis_tlv.sw_upg_file",
6699
15
      FT_STRINGZ, BASE_NONE, NULL, 0x0,
6700
15
      NULL, HFILL}
6701
15
    },
6702
15
    {&hf_docsis_tlv_snmp_access,
6703
15
     {"10 SNMP Write Access", "docsis_tlv.snmp_access",
6704
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6705
15
      NULL, HFILL}
6706
15
    },
6707
15
    {&hf_docsis_tlv_snmp_obj,
6708
15
     {"11 SNMP Object", "docsis_tlv.snmp_obj",
6709
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6710
15
      NULL, HFILL}
6711
15
    },
6712
15
    {&hf_docsis_tlv_modem_addr,
6713
15
     {"12 Modem IP Address", "docsis_tlv.modemaddr",
6714
15
      FT_IPv4, BASE_NONE, NULL, 0x0,
6715
15
      NULL, HFILL}
6716
15
    },
6717
15
    {&hf_docsis_tlv_svc_unavail,
6718
15
     {"13 Service Not Available Response", "docsis_tlv.svcunavail",
6719
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6720
15
      NULL, HFILL}
6721
15
    },
6722
15
    {&hf_docsis_tlv_svc_unavail_classid,
6723
15
     {"Service Not Available: (Class ID)", "docsis_tlv.svcunavail.classid",
6724
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6725
15
      NULL, HFILL}
6726
15
    },
6727
15
    {&hf_docsis_tlv_svc_unavail_type,
6728
15
     {"Service Not Available (Type)", "docsis_tlv.svcunavail.type",
6729
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6730
15
      NULL, HFILL}
6731
15
    },
6732
15
    {&hf_docsis_tlv_svc_unavail_code,
6733
15
     {"Service Not Available (Code)", "docsis_tlv.svcunavail.code",
6734
15
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
6735
15
      NULL, HFILL}
6736
15
    },
6737
15
    {&hf_docsis_tlv_cpe_ethernet,
6738
15
     {"14 CPE Ethernet Addr", "docsis_tlv.cpe_ether",
6739
15
      FT_ETHER, BASE_NONE, NULL, 0x0,
6740
15
      NULL, HFILL}
6741
15
    },
6742
15
    {&hf_docsis_tlv_bpi,
6743
15
     {"17 Baseline Privacy Encoding", "docsis_tlv.bpi",
6744
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6745
15
      NULL, HFILL}
6746
15
    },
6747
15
    {&hf_docsis_tlv_max_cpe,
6748
15
     {"18 Max # of CPE's", "docsis_tlv.maxcpe",
6749
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6750
15
      "Max Number of CPE's", HFILL}
6751
15
    },
6752
15
    {&hf_docsis_tlv_tftp_server_timestamp,
6753
15
     {"19 TFTP Server Timestamp", "docsis_tlv.tftp_time",
6754
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
6755
15
      NULL, HFILL}
6756
15
    },
6757
15
    {&hf_docsis_tlv_tftp_prov_modem_address,
6758
15
     {"20 TFTP Server Provisioned Modem Addr", "docsis_tlv.tftpmodemaddr",
6759
15
      FT_IPv4, BASE_NONE, NULL, 0x0,
6760
15
      NULL, HFILL}
6761
15
    },
6762
15
    {&hf_docsis_tlv_sw_upg_srvr,
6763
15
     {"21 Software Upgrade Server", "docsis_tlv.sw_upg_srvr",
6764
15
      FT_IPv4, BASE_NONE, NULL, 0x0,
6765
15
      NULL, HFILL}
6766
15
    },
6767
#if 0
6768
    {&hf_docsis_tlv_upclsfr,
6769
     {"22 Upstream Classifier", "docsis_tlv.upclsfr",
6770
      FT_BYTES, BASE_NONE, NULL, 0x0,
6771
      NULL, HFILL}
6772
    },
6773
    {&hf_docsis_tlv_downclsfr,
6774
     {"23 Downstream Classifier", "docsis_tlv.downclsfr",
6775
      FT_BYTES, BASE_NONE, NULL, 0x0,
6776
      NULL, HFILL}
6777
    },
6778
#endif
6779
15
    {&hf_docsis_tlv_clsfr_ref,
6780
15
     {".1 Classifier Ref", "docsis_tlv.clsfr.ref",
6781
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6782
15
      "Classifier Reference", HFILL}
6783
15
    },
6784
15
    {&hf_docsis_tlv_clsfr_id,
6785
15
     {".2 Classifier ID", "docsis_tlv.clsfr.id",
6786
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6787
15
      NULL, HFILL}
6788
15
    },
6789
15
    {&hf_docsis_tlv_clsfr_sflow_ref,
6790
15
     {".3 Service Flow Ref", "docsis_tlv.clsfr.sflowref",
6791
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6792
15
      "Service Flow Reference", HFILL}
6793
15
    },
6794
15
    {&hf_docsis_tlv_clsfr_sflow_id,
6795
15
     {".4 Service Flow ID", "docsis_tlv.clsfr.sflowid",
6796
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6797
15
      NULL, HFILL}
6798
15
    },
6799
15
    {&hf_docsis_tlv_clsfr_rule_pri,
6800
15
     {".5 Rule Priority", "docsis_tlv.clsfr.rulepri",
6801
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6802
15
      NULL, HFILL}
6803
15
    },
6804
15
    {&hf_docsis_tlv_clsfr_act_state,
6805
15
     {".6 Activation State", "docsis_tlv.clsfr.actstate",
6806
15
      FT_BOOLEAN, BASE_NONE, TFS (&tfs_active_inactive), 0x0,
6807
15
      "Classifier Activation State", HFILL}
6808
15
    },
6809
15
    {&hf_docsis_tlv_clsfr_dsc_act,
6810
15
     {".7 DSC Action", "docsis_tlv.clsfr.dscact",
6811
15
      FT_UINT8, BASE_DEC, VALS (dsc_act_vals), 0x0,
6812
15
      "Dynamic Service Change Action", HFILL}
6813
15
    },
6814
#if 0
6815
    {&hf_docsis_tlv_clsfr_err,
6816
     {".8 Error Encodings", "docsis_tlv.clsfr.err",
6817
      FT_BYTES, BASE_NONE, NULL, 0x0,
6818
      NULL, HFILL}
6819
    },
6820
#endif
6821
15
    {&hf_docsis_tlv_clsfr_err_param,
6822
15
     {"..1 Param Subtype", "docsis_tlv.clsfr.err.param",
6823
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6824
15
      "Parameter Subtype", HFILL}
6825
15
    },
6826
15
    {&hf_docsis_tlv_clsfr_err_code,
6827
15
     {"..2 Error Code", "docsis_tlv.clsfr.err.code",
6828
15
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
6829
15
      NULL, HFILL}
6830
15
    },
6831
15
    {&hf_docsis_tlv_clsfr_err_msg,
6832
15
     {"..3 Error Message", "docsis_tlv.clsfr.err.msg",
6833
15
      FT_STRINGZ, BASE_NONE, NULL, 0x0,
6834
15
      NULL, HFILL}
6835
15
    },
6836
#if 0
6837
    {&hf_docsis_tlv_ipclsfr,
6838
     {".9 IP Classifier Encodings", "docsis_tlv.clsfr.ip",
6839
      FT_BYTES, BASE_NONE, NULL, 0x0,
6840
      NULL, HFILL}
6841
    },
6842
#endif
6843
15
    {&hf_docsis_tlv_ipclsfr_tosmask,
6844
15
     {"..1 Type Of Service Mask", "docsis_tlv.clsfr.ip.tosmask",
6845
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6846
15
      NULL, HFILL}
6847
15
    },
6848
15
    {&hf_docsis_tlv_ipclsfr_ipproto,
6849
15
     {"..2 IP Protocol", "docsis_tlv.clsfr.ip.ipproto",
6850
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6851
15
      NULL, HFILL}
6852
15
    },
6853
15
    {&hf_docsis_tlv_ipclsfr_src,
6854
15
     {"..3 Source Address", "docsis_tlv.clsfr.ip.src",
6855
15
      FT_IPv4, BASE_NONE, NULL, 0x0,
6856
15
      NULL, HFILL}
6857
15
    },
6858
15
    {&hf_docsis_tlv_ipclsfr_dst,
6859
15
     {"..4 Destination Address", "docsis_tlv.clsfr.ip.dst",
6860
15
      FT_IPv4, BASE_NONE, NULL, 0x0,
6861
15
      NULL, HFILL}
6862
15
    },
6863
15
    {&hf_docsis_tlv_ipclsfr_srcmask,
6864
15
     {"..5 Source Mask", "docsis_tlv.clsfr.ip.smask",
6865
15
      FT_IPv4, BASE_NONE, NULL, 0x0,
6866
15
      NULL, HFILL}
6867
15
    },
6868
15
    {&hf_docsis_tlv_ipclsfr_dstmask,
6869
15
     {"..6 Destination Mask", "docsis_tlv.clsfr.ip.dmask",
6870
15
      FT_IPv4, BASE_NONE, NULL, 0x0,
6871
15
      NULL, HFILL}
6872
15
    },
6873
15
    {&hf_docsis_tlv_ipclsfr_sport_start,
6874
15
     {"..7 Source Port Start", "docsis_tlv.clsfr.ip.sportstart",
6875
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6876
15
      "TCP/UDP Source Port Start", HFILL}
6877
15
    },
6878
15
    {&hf_docsis_tlv_ipclsfr_sport_end,
6879
15
     {"..8 Source Port End", "docsis_tlv.clsfr.ip.sportend",
6880
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6881
15
      "TCP/UDP Source Port End", HFILL}
6882
15
    },
6883
15
    {&hf_docsis_tlv_ipclsfr_dport_start,
6884
15
     {"..9 Dest Port Start", "docsis_tlv.clsfr.ip.dportstart",
6885
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6886
15
      "TCP/UDP Destination Port Start", HFILL}
6887
15
    },
6888
15
    {&hf_docsis_tlv_ipclsfr_dport_end,
6889
15
     {"..10 Dest Port End", "docsis_tlv.clsfr.ip.dportend",
6890
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6891
15
      "TCP/UDP Destination Port End", HFILL}
6892
15
    },
6893
15
    {&hf_docsis_tlv_ip6clsfr_tc_low,
6894
15
     {"tc-low", "docsis_tlv.clsfr.ip6.tc.low",
6895
15
      FT_UINT8, BASE_HEX, NULL, 0x0,
6896
15
      NULL, HFILL}
6897
15
    },
6898
15
    {&hf_docsis_tlv_ip6clsfr_tc_high,
6899
15
     {"tc-high", "docsis_tlv.clsfr.ip6.tc.high",
6900
15
      FT_UINT8, BASE_HEX, NULL, 0x0,
6901
15
      NULL, HFILL}
6902
15
    },
6903
15
    {&hf_docsis_tlv_ip6clsfr_tc_mask,
6904
15
     {"tc-mask", "docsis_tlv.clsfr.ip6.tc.mask",
6905
15
      FT_UINT8, BASE_HEX, NULL, 0x0,
6906
15
      NULL, HFILL}
6907
15
    },
6908
15
    {&hf_docsis_tlv_ip6clsfr_flow_label,
6909
15
     {"..2 Flow Label", "docsis_tlv.clsfr.ip6.flowlabel",
6910
15
      FT_UINT32, BASE_HEX, NULL, 0x0,
6911
15
      NULL, HFILL}
6912
15
    },
6913
15
    {&hf_docsis_tlv_ip6clsfr_next_header,
6914
15
     {"..3 Next Header", "docsis_tlv.clsfr.ip6.nextheader",
6915
15
      FT_UINT16, BASE_DEC, VALS(next_header_vals), 0x0,
6916
15
      NULL, HFILL}
6917
15
    },
6918
15
    {&hf_docsis_tlv_ip6clsfr_src,
6919
15
     {"..4 Source Address", "docsis_tlv.clsfr.ip6.src",
6920
15
      FT_IPv6, BASE_NONE, NULL, 0x0,
6921
15
      NULL, HFILL}
6922
15
    },
6923
15
    {&hf_docsis_tlv_ip6clsfr_src_prefix_length,
6924
15
     {"..5 Source Prefix Length", "docsis_tlv.clsfr.ip6.src_prefix_length",
6925
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6926
15
      NULL, HFILL}
6927
15
    },
6928
15
    {&hf_docsis_tlv_ip6clsfr_dst,
6929
15
     {"..6 Destination Address", "docsis_tlv.clsfr.ip6.dst",
6930
15
      FT_IPv6, BASE_NONE, NULL, 0x0,
6931
15
      NULL, HFILL}
6932
15
    },
6933
15
    {&hf_docsis_tlv_ip6clsfr_dst_prefix_length,
6934
15
     {"..7 Destination Prefix Length", "docsis_tlv.clsfr.ip6.dst_prefix_length",
6935
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
6936
15
      NULL, HFILL}
6937
15
    },
6938
#if 0
6939
    {&hf_docsis_tlv_ethclsfr,
6940
     {".10 Ethernet Classifier Encodings", "docsis_tlv.clsfr.eth",
6941
      FT_BYTES, BASE_NONE, NULL, 0x0,
6942
      NULL, HFILL}
6943
    },
6944
#endif
6945
15
    {&hf_docsis_tlv_ethclsfr_dmac,
6946
15
     {"..1 Dest MAC Address", "docsis_tlv.clsfr.eth.dmac",
6947
15
      FT_ETHER, BASE_NONE, NULL, 0x0,
6948
15
      "Destination MAC Address", HFILL}
6949
15
    },
6950
15
    {&hf_docsis_tlv_ethclsfr_smac,
6951
15
     {"..2 Source MAC Address", "docsis_tlv.clsfr.eth.smac",
6952
15
      FT_ETHER, BASE_NONE, NULL, 0x0,
6953
15
      NULL, HFILL}
6954
15
    },
6955
15
    {&hf_docsis_tlv_ethclsfr_ethertype,
6956
15
     {"..3 Ethertype", "docsis_tlv.clsfr.eth.ethertype",
6957
15
      FT_UINT24, BASE_HEX, NULL, 0x0,
6958
15
      NULL, HFILL}
6959
15
    },
6960
#if 0
6961
    {&hf_docsis_tlv_dot1qclsfr,
6962
     {".11 802.1Q Classifier Encodings", "docsis_tlv.clsfr.dot1q",
6963
      FT_BYTES, BASE_NONE, NULL, 0x0,
6964
      NULL, HFILL}
6965
    },
6966
#endif
6967
15
    {&hf_docsis_tlv_dot1qclsfr_user_pri,
6968
15
     {"..1 User Priority", "docsis_tlv.clsfr.dot1q.userpri",
6969
15
      FT_UINT16, BASE_HEX, NULL, 0x0,
6970
15
      NULL, HFILL}
6971
15
    },
6972
15
    {&hf_docsis_tlv_dot1qclsfr_vlanid,
6973
15
     {"..2 VLAN ID", "docsis_tlv.clsfr.dot1q.ethertype",
6974
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
6975
15
      NULL, HFILL}
6976
15
    },
6977
15
    {&hf_docsis_tlv_dot1qclsfr_vendorspec,
6978
15
     {"..43 Vendor Specific Encodings", "docsis_tlv.clsfr.dot1q.vendorspec",
6979
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6980
15
      NULL, HFILL}
6981
15
    },
6982
15
    {&hf_docsis_tlv_clsfr_vendor_spc,
6983
15
     {".43 Vendor Specific Encodings", "docsis_tlv.clsfr.vendor",
6984
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
6985
15
      NULL, HFILL}
6986
15
    },
6987
#if 0
6988
    {&hf_docsis_tlv_upsflow,
6989
     {"24 Upstream Service Flow", "docsis_tlv.upsflow",
6990
      FT_BYTES, BASE_NONE, NULL, 0x0,
6991
      NULL, HFILL}
6992
    },
6993
    {&hf_docsis_tlv_downsflow,
6994
     {"25 Downstream Service Flow", "docsis_tlv.downsflow",
6995
      FT_BYTES, BASE_NONE, NULL, 0x0,
6996
      NULL, HFILL}
6997
    },
6998
#endif
6999
15
    {&hf_docsis_tlv_sflow_ref,
7000
15
     {".1 Service Flow Ref", "docsis_tlv.sflow.ref",
7001
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7002
15
      "Service Flow Reference", HFILL}
7003
15
    },
7004
15
    {&hf_docsis_tlv_sflow_id,
7005
15
     {".2 Service Flow ID", "docsis_tlv.sflow.id",
7006
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7007
15
      NULL, HFILL}
7008
15
    },
7009
15
    {&hf_docsis_tlv_sflow_sid,
7010
15
     {".3 Service Identifier", "docsis_tlv.sflow.sid",
7011
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7012
15
      NULL, HFILL}
7013
15
    },
7014
15
    {&hf_docsis_tlv_sflow_classname,
7015
15
     {".4 Service Class Name", "docsis_tlv.sflow.cname",
7016
15
      FT_STRINGZ, BASE_NONE, NULL, 0x0,
7017
15
      NULL, HFILL}
7018
15
    },
7019
#if 0
7020
    {&hf_docsis_tlv_sflow_err,
7021
     {".5 Error Encodings", "docsis_tlv.sflow.err",
7022
      FT_BYTES, BASE_NONE, NULL, 0x0,
7023
      NULL, HFILL}
7024
    },
7025
#endif
7026
15
    {&hf_docsis_tlv_sflow_err_param,
7027
15
     {"..1 Param Subtype", "docsis_tlv.sflow.err.param",
7028
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7029
15
      "Parameter Subtype", HFILL}
7030
15
    },
7031
15
    {&hf_docsis_tlv_sflow_err_code,
7032
15
     {"..2 Error Code", "docsis_tlv.sflow.err.code",
7033
15
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
7034
15
      NULL, HFILL}
7035
15
    },
7036
15
    {&hf_docsis_tlv_sflow_err_msg,
7037
15
     {"..3 Error Message", "docsis_tlv.sflow.err.msg",
7038
15
      FT_STRINGZ, BASE_NONE, NULL, 0x0,
7039
15
      NULL, HFILL}
7040
15
    },
7041
15
    {&hf_docsis_tlv_sflow_qos_param,
7042
15
     {".6 QOS Parameter Set", "docsis_tlv.sflow.qos",
7043
15
      FT_UINT8, BASE_HEX, VALS (qos_param_vals), 0x0,
7044
15
      NULL, HFILL}
7045
15
    },
7046
15
    {&hf_docsis_tlv_sflow_traf_pri,
7047
15
     {".7 Traffic Priority", "docsis_tlv.sflow.trafpri",
7048
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7049
15
      NULL, HFILL}
7050
15
    },
7051
15
    {&hf_docsis_tlv_sflow_max_sus,
7052
15
     {".8 Maximum Sustained Traffic Rate (bps)", "docsis_tlv.sflow.maxtrafrate",
7053
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7054
15
      NULL, HFILL}
7055
15
    },
7056
15
    {&hf_docsis_tlv_sflow_max_burst,
7057
15
     {".9 Maximum Burst (bps)", "docsis_tlv.sflow.maxburst",
7058
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7059
15
      NULL, HFILL}
7060
15
    },
7061
15
    {&hf_docsis_tlv_sflow_min_traf,
7062
15
     {".10 Minimum Traffic Rate (bps)", "docsis_tlv.sflow.mintrafrate",
7063
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7064
15
      NULL, HFILL}
7065
15
    },
7066
15
    {&hf_docsis_tlv_sflow_ass_min_pkt_size,
7067
15
     {".11 Assumed Min Reserved Packet Size", "docsis_tlv.sflow.assumed_min_pkt_size",
7068
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7069
15
      "Assumed Minimum Reserved Packet Size", HFILL}
7070
15
    },
7071
15
    {&hf_docsis_tlv_sflow_timeout_active,
7072
15
     {".12 Timeout for Active Params (secs)", "docsis_tlv.sflow.act_timeout",
7073
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7074
15
      NULL, HFILL}
7075
15
    },
7076
15
    {&hf_docsis_tlv_sflow_timeout_admitted,
7077
15
     {".13 Timeout for Admitted Params (secs)", "docsis_tlv.sflow.adm_timeout",
7078
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7079
15
      NULL, HFILL}
7080
15
    },
7081
15
    {&hf_docsis_tlv_sflow_max_down_latency,
7082
15
     {".14 Maximum Downstream Latency (usec)", "docsis_tlv.sflow.max_down_lat",
7083
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7084
15
      NULL, HFILL}
7085
15
    },
7086
15
    {&hf_docsis_tlv_sflow_max_concat_burst,
7087
15
     {".14 Max Concat Burst", "docsis_tlv.sflow.maxconcat",
7088
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7089
15
      "Max Concatenated Burst", HFILL}
7090
15
    },
7091
15
    {&hf_docsis_tlv_sflow_sched_type,
7092
15
     {".15 Scheduling Type", "docsis_tlv.sflow.schedtype",
7093
15
      FT_UINT32, BASE_HEX, VALS (sched_type_vals), 0x0,
7094
15
      NULL, HFILL}
7095
15
    },
7096
15
    {&hf_docsis_tlv_sflow_down_reseq,
7097
15
     {".17 Downstream Resequencing", "docsis_tlv.sflow.down_reseq",
7098
15
      FT_UINT8, BASE_DEC, VALS(down_reseq_vals), 0x0,
7099
15
      NULL, HFILL}
7100
15
    },
7101
15
    {&hf_docsis_tlv_sflow_reqxmit_pol,
7102
15
     {".16 Request/Transmission Policy", "docsis_tlv.sflow.reqxmitpol",
7103
15
      FT_UINT32, BASE_HEX, NULL, 0x0,
7104
15
      NULL, HFILL}
7105
15
    },
7106
15
    {&hf_docsis_tlv_sflow_reqxmit_all_cm_broadcast,
7107
15
     {"Service flow use \"all CMs\" broadcast request opportunities", "docsis_tlv.sflow.reqxmitpol.all_cm_broadcast",
7108
15
      FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000001,
7109
15
      NULL, HFILL}
7110
15
    },
7111
15
    {&hf_docsis_tlv_sflow_reqxmit_priority_multicast,
7112
15
     {"Service flow use priority multicast request opportunities", "docsis_tlv.sflow.reqxmitpol.priority_multicast",
7113
15
      FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000002,
7114
15
      NULL, HFILL}
7115
15
    },
7116
15
    {&hf_docsis_tlv_sflow_reqxmit_req_data_requests,
7117
15
     {"Service flow use Request/Data opportunities for requests", "docsis_tlv.sflow.reqxmitpol.req_data_requests",
7118
15
      FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000004,
7119
15
      NULL, HFILL}
7120
15
    },
7121
15
    {&hf_docsis_tlv_sflow_reqxmit_req_data_data,
7122
15
     {"Service flow use Request/Data opportunities for data", "docsis_tlv.sflow.reqxmitpol.req_data_data",
7123
15
      FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000008,
7124
15
      NULL, HFILL}
7125
15
    },
7126
15
    {&hf_docsis_tlv_sflow_reqxmit_piggy_back,
7127
15
     {"Service flow use piggy back requests with data", "docsis_tlv.sflow.reqxmitpol.piggy_back",
7128
15
      FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000010,
7129
15
      NULL, HFILL}
7130
15
    },
7131
15
    {&hf_docsis_tlv_sflow_reqxmit_concatenate_data,
7132
15
     {"Service flow concatenate data", "docsis_tlv.sflow.reqxmitpol.concatenate_data",
7133
15
      FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000020,
7134
15
      NULL, HFILL}
7135
15
    },
7136
15
    {&hf_docsis_tlv_sflow_reqxmit_fragment,
7137
15
     {"Service flow fragment data", "docsis_tlv.sflow.reqxmitpol.fragment",
7138
15
      FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000040,
7139
15
      NULL, HFILL}
7140
15
    },
7141
15
    {&hf_docsis_tlv_sflow_reqxmit_suppress_payload,
7142
15
     {"Service flow suppress payload headers", "docsis_tlv.sflow.reqxmitpol.suppress_payload",
7143
15
      FT_BOOLEAN, 32, TFS(&tfs_must_not_must), 0x00000080,
7144
15
      NULL, HFILL}
7145
15
    },
7146
15
    {&hf_docsis_tlv_sflow_reqxmit_drop_packets,
7147
15
     {"Service flow drop packets that do not fit in the UGS size", "docsis_tlv.sflow.reqxmitpol.drop_packets",
7148
15
      FT_BOOLEAN, 32, TFS(&tfs_must_must_not), 0x00000100,
7149
15
      NULL, HFILL}
7150
15
    },
7151
15
    {&hf_docsis_tlv_sflow_nominal_polling,
7152
15
     {".17 Nominal Polling Interval(usec)", "docsis_tlv.sflow.nominal_polling",
7153
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7154
15
      NULL, HFILL}
7155
15
    },
7156
15
    {&hf_docsis_tlv_sflow_tolerated_jitter,
7157
15
     {".18 Tolerated Poll Jitter (usec)", "docsis_tlv.sflow.toler_jitter",
7158
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7159
15
      NULL, HFILL}
7160
15
    },
7161
15
    {&hf_docsis_tlv_sflow_ugs_size,
7162
15
     {".19 Unsolicited Grant Size (bytes)", "docsis_tlv.sflow.ugs_size",
7163
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7164
15
      NULL, HFILL}
7165
15
    },
7166
15
    {&hf_docsis_tlv_sflow_nom_grant_intvl,
7167
15
     {".20 Nominal Grant Interval (usec)", "docsis_tlv.sflow.nom_grant_intvl",
7168
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7169
15
      NULL, HFILL}
7170
15
    },
7171
15
    {&hf_docsis_tlv_sflow_tol_grant_jitter,
7172
15
     {".21 Tolerated Grant Jitter (usec)", "docsis_tlv.sflow.tol_grant_jitter",
7173
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7174
15
      NULL, HFILL}
7175
15
    },
7176
15
    {&hf_docsis_tlv_sflow_grants_per_intvl,
7177
15
     {".22 Grants Per Interval", "docsis_tlv.sflow.grnts_per_intvl",
7178
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7179
15
      NULL, HFILL}
7180
15
    },
7181
15
    {&hf_docsis_tlv_sflow_ip_tos_overwrite,
7182
15
     {".23 IP TOS Overwrite", "docsis_tlv.sflow.iptos_overwrite",
7183
15
      FT_UINT16, BASE_HEX, NULL, 0x0,
7184
15
      NULL, HFILL}
7185
15
    },
7186
15
    {&hf_docsis_tlv_sflow_ugs_timeref,
7187
15
     {".24 UGS Time Reference", "docsis_tlv.sflow.ugs_timeref",
7188
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7189
15
      NULL, HFILL}
7190
15
    },
7191
15
    {&hf_docsis_tlv_sflow_cont_req_backoff_window_mult,
7192
15
     {".25 Multiplier to Contention Request Backoff Window", "docsis_tlv.sflow.cont_req_backoff_window_mult",
7193
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7194
15
      NULL, HFILL}
7195
15
    },
7196
15
    {&hf_docsis_tlv_sflow_num_of_bytes_requested_mult,
7197
15
     {".26 Multiplier to Number of Bytes Requested", "docsis_tlv.sflow.num_of_bytes_requested_mult",
7198
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7199
15
      NULL, HFILL}
7200
15
    },
7201
15
    {&hf_docsis_tlv_sflow_peak_traffic_rate,
7202
15
     {".27 Peak Traffic Rate", "docsis_tlv.sflow.peak_traffic_rate",
7203
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7204
15
      NULL, HFILL}
7205
15
    },
7206
15
    {&hf_docsis_tlv_sflow_req_attr_mask,
7207
15
     {".31 Required Attribute Mask", "docsis_tlv.sflow.req_attr_mask",
7208
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7209
15
      NULL, HFILL}
7210
15
    },
7211
15
    {&hf_docsis_tlv_sflow_forb_attr_mask,
7212
15
     {".32 Forbidden Attribute Mask", "docsis_tlv.sflow.forb_attr_mask",
7213
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7214
15
      NULL, HFILL}
7215
15
    },
7216
15
    {&hf_docsis_tlv_sflow_attr_aggr_rule_mask,
7217
15
     {".33 Attribute Aggregation Rule Mask", "docsis_tlv.sflow.attr_aggr_rule_mask",
7218
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7219
15
      NULL, HFILL}
7220
15
    },
7221
15
    {&hf_docsis_tlv_sflow_vendor_spec,
7222
15
     {".43 Vendor Specific Encodings", "docsis_tlv.sflow.vendorspec",
7223
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7224
15
      NULL, HFILL}
7225
15
    },
7226
#if 0
7227
    {&hf_docsis_tlv_phs,
7228
     {"26 PHS Rules", "docsis_tlv.phs",
7229
      FT_BYTES, BASE_NONE, NULL, 0x0,
7230
      NULL, HFILL}
7231
    },
7232
#endif
7233
15
    {&hf_docsis_tlv_phs_class_ref,
7234
15
     {".1 Classifier Reference", "docsis_tlv.phs.classref",
7235
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7236
15
      NULL, HFILL}
7237
15
    },
7238
15
    {&hf_docsis_tlv_phs_class_id,
7239
15
     {".2 Classifier ID", "docsis_tlv.phs.classid",
7240
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7241
15
      NULL, HFILL}
7242
15
    },
7243
15
    {&hf_docsis_tlv_phs_sflow_ref,
7244
15
     {".3 Service flow reference", "docsis_tlv.phs.sflowref",
7245
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7246
15
      NULL, HFILL}
7247
15
    },
7248
15
    {&hf_docsis_tlv_phs_sflow_id,
7249
15
     {".4 Service flow ID", "docsis_tlv.phs.sflowid",
7250
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7251
15
      NULL, HFILL}
7252
15
    },
7253
15
    {&hf_docsis_tlv_phs_dsc_action,
7254
15
     {".5 DSC Action", "docsis_tlv.phs.dscaction",
7255
15
      FT_UINT8, BASE_DEC, VALS (action_vals), 0x0,
7256
15
      "Dynamic Service Change Action", HFILL}
7257
15
    },
7258
#if 0
7259
    {&hf_docsis_tlv_phs_err,
7260
     {".6 Error Encodings", "docsis_tlv.phs.err",
7261
      FT_BYTES, BASE_NONE, NULL, 0x0,
7262
      NULL, HFILL}
7263
    },
7264
#endif
7265
15
    {&hf_docsis_tlv_phs_err_param,
7266
15
     {"..1 Param Subtype", "docsis_tlv.phs.err.param",
7267
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7268
15
      "Parameter Subtype", HFILL}
7269
15
    },
7270
15
    {&hf_docsis_tlv_phs_err_code,
7271
15
     {"..2 Error Code", "docsis_tlv.phs.err.code",
7272
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7273
15
      NULL, HFILL}
7274
15
    },
7275
15
    {&hf_docsis_tlv_phs_err_msg,
7276
15
     {"..3 Error Message", "docsis_tlv.phs.err.msg",
7277
15
      FT_STRINGZ, BASE_NONE, NULL, 0x0,
7278
15
      NULL, HFILL}
7279
15
    },
7280
15
    {&hf_docsis_tlv_phs_phsf,
7281
15
     {".7 PHS Field", "docsis_tlv.phs.phsf",
7282
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7283
15
      NULL, HFILL}
7284
15
    },
7285
15
    {&hf_docsis_tlv_phs_phsi,
7286
15
     {".8 PHS Index", "docsis_tlv.phs.phsi",
7287
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7288
15
      NULL, HFILL}
7289
15
    },
7290
15
    {&hf_docsis_tlv_phs_phsm,
7291
15
     {".9 PHS Mask", "docsis_tlv.phs.phsm",
7292
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7293
15
      NULL, HFILL}
7294
15
    },
7295
15
    {&hf_docsis_tlv_phs_phss,
7296
15
     {".10 PHS Size", "docsis_tlv.phs.phss",
7297
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7298
15
      NULL, HFILL}
7299
15
    },
7300
15
    {&hf_docsis_tlv_phs_dbc_action,
7301
15
     {".13 PHS Dynamic Bonding Change Action", "docsis_tlv.phs.dbc_action",
7302
15
      FT_UINT8, BASE_DEC, VALS (dbc_action_vals), 0x0,
7303
15
      NULL, HFILL}
7304
15
    },
7305
#if 0
7306
    {&hf_docsis_tlv_phs_phsv,
7307
     {".11 PHS Verify", "docsis_tlv.phs.phsv",
7308
      FT_BOOLEAN, BASE_NONE, TFS (&verify_tfs), 0x0,
7309
      NULL, HFILL}
7310
    },
7311
#endif
7312
15
    {&hf_docsis_tlv_phs_vendorspec,
7313
15
     {".43 PHS Vendor Specific", "docsis_tlv.phs.vendorspec",
7314
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7315
15
      NULL, HFILL}
7316
15
    },
7317
15
    {&hf_docsis_tlv_hmac_digest,
7318
15
     {"27 HMAC Digest", "docsis_tlv.hmac_digest",
7319
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7320
15
      NULL, HFILL}
7321
15
    },
7322
15
    {&hf_docsis_tlv_max_classifiers,
7323
15
     {"28 Max # of Classifiers", "docsis_tlv.maxclass",
7324
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7325
15
      NULL, HFILL}
7326
15
    },
7327
15
    {&hf_docsis_tlv_privacy_enable,
7328
15
     {"29 Privacy Enable", "docsis_tlv.bpi_en",
7329
15
      FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
7330
15
      NULL, HFILL}
7331
15
    },
7332
15
    {&hf_docsis_tlv_auth_block,
7333
15
     {"30 Auth Block", "docsis_tlv.auth_block",
7334
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7335
15
      NULL, HFILL}
7336
15
    },
7337
15
    {&hf_docsis_tlv_key_seq_num,
7338
15
     {"31 Key Sequence Number", "docsis_tlv.key_seq",
7339
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7340
15
      NULL, HFILL}
7341
15
    },
7342
15
    {&hf_docsis_tlv_mfgr_cvc,
7343
15
     {"32 Manufacturer CVC", "docsis_tlv.mfgr_cvc",
7344
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7345
15
      NULL, HFILL}
7346
15
    },
7347
15
    {&hf_docsis_tlv_cosign_cvc,
7348
15
     {"33 Co-Signer CVC", "docsis_tlv.cosign_cvc",
7349
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7350
15
      NULL, HFILL}
7351
15
    },
7352
15
    {&hf_docsis_tlv_snmpv3_kick,
7353
15
     {"34 SNMPv3 Kickstart Value", "docsis_tlv.snmpv3",
7354
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7355
15
      NULL, HFILL}
7356
15
    },
7357
15
    {&hf_docsis_tlv_snmpv3_kick_name,
7358
15
     {".1 SNMPv3 Kickstart Security Name", "docsis_tlv.snmpv3.secname",
7359
15
      FT_STRING, BASE_NONE, NULL, 0x0,
7360
15
      NULL, HFILL}
7361
15
    },
7362
15
    {&hf_docsis_tlv_snmpv3_kick_publicnum,
7363
15
     {".2 SNMPv3 Kickstart Manager Public Number", "docsis_tlv.snmpv3.publicnum",
7364
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7365
15
      NULL, HFILL}
7366
15
    },
7367
15
    {&hf_docsis_tlv_subs_mgmt_ctrl,
7368
15
     {"35 Subscriber Management Control", "docsis_tlv.subsmgmtctrl",
7369
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7370
15
      NULL, HFILL}
7371
15
    },
7372
15
    {&hf_docsis_tlv_subs_mgmt_ip_table,
7373
15
     {"36 Subscriber Management CPE IP Table", "docsis_tlv.subsiptable",
7374
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7375
15
      NULL, HFILL}
7376
15
    },
7377
15
    {&hf_docsis_tlv_subs_mgmt_ip_entry,
7378
15
     {"Subscriber Management CPE IP Entry", "docsis_tlv.subsipentry",
7379
15
      FT_IPv4, BASE_NONE, NULL, 0x0,
7380
15
      NULL, HFILL}
7381
15
    },
7382
15
    {&hf_docsis_tlv_subs_mgmt_filter_grps,
7383
15
     {"37 Subscriber Management Filter Groups", "docsis_tlv.subsfltrgrps",
7384
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7385
15
      NULL, HFILL}
7386
15
    },
7387
15
    {&hf_docsis_tlv_snmpv3_ntfy_rcvr,
7388
15
     {"38 SNMPv3 Notification Receiver", "docsis_tlv.snmpv3ntfy",
7389
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7390
15
      NULL, HFILL}
7391
15
    },
7392
15
    {&hf_docsis_tlv_enable_20_mode,
7393
15
     {"39 Enable 2.0 Mode", "docsis_tlv.enable20mode",
7394
15
      FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
7395
15
      NULL, HFILL}
7396
15
    },
7397
15
    {&hf_docsis_tlv_enable_test_modes,
7398
15
     {"40 Enable Test Modes", "docsis_tlv.enabletestmodes",
7399
15
      FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
7400
15
      NULL, HFILL}
7401
15
    },
7402
#if 0
7403
    {&hf_docsis_tlv_ds_ch_list,
7404
     {"41 Downstream Channel List", "docsis_tlv.dschlist",
7405
      FT_BYTES, BASE_NONE, NULL, 0x0,
7406
      NULL, HFILL}
7407
    },
7408
    {&hf_docsis_tlv_ds_ch_list_single,
7409
     {".1 Single Downstream Channel", "docsis_tlv.dschlist.single",
7410
      FT_BYTES, BASE_NONE, NULL, 0x0,
7411
      NULL, HFILL}
7412
    },
7413
#endif
7414
15
    {&hf_docsis_tlv_single_ch_timeout,
7415
15
     {"..1 Timeout", "docsis_tlv.dschlist.single.timeout",
7416
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7417
15
      NULL, HFILL}
7418
15
    },
7419
15
    {&hf_docsis_tlv_single_ch_freq,
7420
15
     {"..2 Timeout", "docsis_tlv.dschlist.single.freq",
7421
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7422
15
      NULL, HFILL}
7423
15
    },
7424
#if 0
7425
    {&hf_docsis_tlv_ds_ch_list_range,
7426
     {".2 Downstream Frequency Range", "docsis_tlv.dschlist.range",
7427
      FT_BYTES, BASE_NONE, NULL, 0x0,
7428
      NULL, HFILL}
7429
    },
7430
#endif
7431
15
    {&hf_docsis_tlv_freq_rng_timeout,
7432
15
     {"..1 Timeout", "docsis_tlv.dschlist.range.timeout",
7433
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7434
15
      NULL, HFILL}
7435
15
    },
7436
15
    {&hf_docsis_tlv_freq_rng_start,
7437
15
     {"..2 Frequency Start", "docsis_tlv.dschlist.range.start",
7438
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7439
15
      NULL, HFILL}
7440
15
    },
7441
15
    {&hf_docsis_tlv_freq_rng_end,
7442
15
     {"..3 Frequency End", "docsis_tlv.dschlist.range.end",
7443
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7444
15
      NULL, HFILL}
7445
15
    },
7446
15
    {&hf_docsis_tlv_freq_rng_step,
7447
15
     {"..4 Frequency Step Size", "docsis_tlv.dschlist.range.step",
7448
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7449
15
      NULL, HFILL}
7450
15
    },
7451
15
    {&hf_docsis_tlv_ds_ch_list_default_timeout,
7452
15
     {".3 Default Scanning Timeout", "docsis_tlv.dschlist.defaulttimeout",
7453
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7454
15
      NULL, HFILL}
7455
15
    },
7456
15
    {&hf_docsis_tlv_mc_mac_address,
7457
15
     {"42 Static Multicast MAC Address", "docsis_tlv.mcmac",
7458
15
      FT_ETHER, BASE_NONE, NULL, 0x0,
7459
15
      NULL, HFILL}
7460
15
    },
7461
#if 0
7462
    {&hf_docsis_tlv_vendor_spec,
7463
     {"43 Vendor Specific Encodings", "docsis_tlv.vendorspec",
7464
      FT_BYTES, BASE_NONE, NULL, 0x0,
7465
      NULL, HFILL}
7466
    },
7467
#endif
7468
15
    {&hf_docsis_tlv_rng_tech,
7469
15
     {"Ranging Technique", "docsis_tlv.rng_tech",
7470
15
      FT_UINT8, BASE_DEC, VALS (rng_tech_vals), 0x0,
7471
15
      NULL, HFILL}
7472
15
    },
7473
#if 0
7474
    {&hf_docsis_tlv_dut_filter,
7475
     {"45 Downstream Unencrypted Traffic Filtering Encoding", "docsis_tlv.dut",
7476
      FT_BYTES, BASE_NONE, NULL, 0x0,
7477
      NULL, HFILL}
7478
    },
7479
#endif
7480
15
    {&hf_docsis_tlv_dut_filter_control,
7481
15
     {".1 DUT Control", "docsis_tlv.dut.control",
7482
15
      FT_BOOLEAN, BASE_NONE, TFS (&ena_dis_tfs), 0x0,
7483
15
      NULL, HFILL}
7484
15
    },
7485
15
    {&hf_docsis_tlv_dut_filter_cmim,
7486
15
     {".2 DUT CMIM", "docsis_tlv.dut.cmim",
7487
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7488
15
      NULL, HFILL}
7489
15
    },
7490
#if 0
7491
    {&hf_docsis_tlv_tcc,
7492
     {"46 Transmit Channel Configuration", "docsis_tlv.tcc",
7493
      FT_BYTES, BASE_NONE, NULL, 0x0,
7494
      NULL, HFILL}
7495
    },
7496
#endif
7497
15
    {&hf_docsis_tlv_tcc_refid,
7498
15
     {".1 TCC Reference ID", "docsis_tlv.tcc.refid",
7499
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7500
15
      NULL, HFILL}
7501
15
    },
7502
15
    {&hf_docsis_tlv_tcc_us_ch_action,
7503
15
     {".2 Upstream Channel Action", "docsis_tlv.tcc.uschact",
7504
15
      FT_UINT8, BASE_DEC, VALS (us_ch_action_vals), 0x0,
7505
15
      NULL, HFILL}
7506
15
    },
7507
15
    {&hf_docsis_tlv_tcc_us_ch_id,
7508
15
     {".3 Upstream Channel ID", "docsis_tlv.tcc.uschid",
7509
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7510
15
      NULL, HFILL}
7511
15
    },
7512
15
    {&hf_docsis_tlv_tcc_new_us_ch_id,
7513
15
     {".4 New Upstream Channel ID", "docsis_tlv.tcc.newuschid",
7514
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7515
15
      NULL, HFILL}
7516
15
    },
7517
15
    {&hf_docsis_tlv_tcc_ucd,
7518
15
     {".5 Upstream Channel Descriptor", "docsis_tlv.tcc.ucd",
7519
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7520
15
      NULL, HFILL}
7521
15
    },
7522
15
    {&hf_docsis_tlv_tcc_rng_sid,
7523
15
     {".6 Ranging SID", "docsis_tlv.tcc.rngsid",
7524
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7525
15
      NULL, HFILL}
7526
15
    },
7527
15
    {&hf_docsis_tlv_tcc_init_tech,
7528
15
     {".7 Initialization Technique", "docsis_tlv.tcc.inittech",
7529
15
      FT_UINT8, BASE_DEC, VALS (init_tech_vals), 0x0,
7530
15
      NULL, HFILL}
7531
15
    },
7532
#if 0
7533
    {&hf_docsis_tlv_tcc_rng_parms,
7534
     {".8 Ranging Parameters", "docsis_tlv.tcc.rngparms",
7535
      FT_BYTES, BASE_NONE, NULL, 0x0,
7536
      NULL, HFILL}
7537
    },
7538
#endif
7539
    /* TODO: wrong label? */
7540
15
    {&hf_docsis_rng_parms_us_ch_id,
7541
15
     {"..1 Ranging Reference Channel ID", "docsis_tlv.tcc.rngparms.uschid",
7542
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7543
15
      "Upstream Channel ID", HFILL}
7544
15
    },
7545
15
    {&hf_docsis_rng_parms_time_off_int,
7546
15
     {"..2 Timing Offset, Integer Part", "docsis_tlv.tcc.rngparms.timeoffint",
7547
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7548
15
      NULL, HFILL}
7549
15
    },
7550
15
    {&hf_docsis_rng_parms_time_off_frac,
7551
15
     {"..3 Timing Offset, Fractional Part", "docsis_tlv.tcc.rngparms.timeofffrac",
7552
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7553
15
      NULL, HFILL}
7554
15
    },
7555
15
    {&hf_docsis_rng_parms_power_off,
7556
15
     {"..4 Power Offset", "docsis_tlv.tcc.rngparms.poweroff",
7557
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7558
15
      NULL, HFILL}
7559
15
    },
7560
15
    {&hf_docsis_rng_parms_freq_off,
7561
15
     {"..5 Frequency Offset", "docsis_tlv.tcc.rngparms.freqoff",
7562
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7563
15
      NULL, HFILL}
7564
15
    },
7565
15
    {&hf_docsis_tlv_tcc_dyn_rng_win,
7566
15
     {".9 Dynamic Range Window", "docsis_tlv.tcc.dynrngwin",
7567
15
      FT_UINT8, BASE_CUSTOM, CF_FUNC(fourth_db), 0x0,
7568
15
      NULL, HFILL}
7569
15
    },
7570
15
    {&hf_docsis_tlv_tcc_p_16hi,
7571
15
     {".10 P1.6hi", "docsis_tlv.tcc.p16hi",
7572
15
      FT_UINT8, BASE_CUSTOM, CF_FUNC(fourth_dbmv), 0x0,
7573
15
      NULL, HFILL}
7574
15
    },
7575
15
    {&hf_docsis_tlv_tcc_oudp_iuc,
7576
15
     {"OUDP IUC", "docsis_tlv.tcc.oudp_iuc",
7577
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7578
15
      NULL, HFILL}
7579
15
    },
7580
15
    {&hf_docsis_tlv_tcc_extended_drw,
7581
15
     {".14 Extended Dynamic Range Window", "docsis_tlv.tcc.extended_dynrngwin",
7582
15
      FT_UINT8, BASE_CUSTOM, CF_FUNC(fourth_db), 0x0,
7583
15
      NULL, HFILL}
7584
15
    },
7585
15
    {&hf_docsis_tlv_tcc_extended_us_rng_pwr,
7586
15
     {".15 Extended US Ranging Power", "docsis_tlv.tcc.extended_us_rng_pwr",
7587
15
      FT_UINT16, BASE_CUSTOM, CF_FUNC(fourth_db), 0x0,
7588
15
      NULL, HFILL}
7589
15
    },
7590
15
    {&hf_docsis_tlv_tcc_oudp_sounding_sid,
7591
15
     {".16 OUDP Sounding SID", "docsis_tlv.tcc.oudp_sounding_sid",
7592
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7593
15
      NULL, HFILL}
7594
15
    },
7595
#if 0
7596
    {&hf_docsis_tlv_tcc_err,
7597
     {".10 TCC Error Encodings", "docsis_tlv.tcc.err",
7598
      FT_BYTES, BASE_NONE, NULL, 0x0,
7599
      NULL, HFILL}
7600
    },
7601
#endif
7602
15
    {&hf_docsis_tcc_err_subtype,
7603
15
     {"..1 TCC Subtype", "docsis_tlv.tcc.err.subtype",
7604
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7605
15
      NULL, HFILL}
7606
15
    },
7607
15
    {&hf_docsis_tcc_err_code,
7608
15
     {"..2 Error Code", "docsis_tlv.tcc.err.code",
7609
15
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
7610
15
      NULL, HFILL}
7611
15
    },
7612
15
    {&hf_docsis_tcc_err_msg,
7613
15
     {"..3 Error Message", "docsis_tlv.tcc.err.msg",
7614
15
      FT_STRINGZ, BASE_NONE, NULL, 0x0,
7615
15
      NULL, HFILL}
7616
15
    },
7617
#if 0
7618
    {&hf_docsis_tlv_sid_cl,
7619
     {"47 Service Flow SID Cluster Assignments", "docsis_tlv.sid",
7620
      FT_BYTES, BASE_NONE, NULL, 0x0,
7621
      NULL, HFILL}
7622
    },
7623
#endif
7624
15
    {&hf_docsis_sid_cl_sf_id,
7625
15
     {".1 Service Flow ID", "docsis_tlv.sid.sfid",
7626
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7627
15
      NULL, HFILL}
7628
15
    },
7629
#if 0
7630
    {&hf_docsis_sid_cl_enc,
7631
     {".2 SID Cluster Encodings", "docsis_tlv.sid.enc",
7632
      FT_BYTES, BASE_NONE, NULL, 0x0,
7633
      NULL, HFILL}
7634
    },
7635
#endif
7636
15
    {&hf_docsis_sid_cl_enc_id,
7637
15
     {"..1 SID Cluster ID", "docsis_tlv.sid.enc.id",
7638
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7639
15
      NULL, HFILL}
7640
15
    },
7641
#if 0
7642
    {&hf_docsis_sid_cl_enc_map,
7643
     {"..2 SID-to-Channel Mapping", "docsis_tlv.sid.enc.map",
7644
      FT_BYTES, BASE_NONE, NULL, 0x0,
7645
      NULL, HFILL}
7646
    },
7647
#endif
7648
15
    {&hf_docsis_sid_cl_map_us_ch_id,
7649
15
     {"...1 Upstream Channel ID", "docsis_tlv.sid.enc.map.uschid",
7650
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7651
15
      NULL, HFILL}
7652
15
    },
7653
15
    {&hf_docsis_sid_cl_map_sid,
7654
15
     {"...2 SID", "docsis_tlv.sid.enc.map.sid",
7655
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7656
15
      NULL, HFILL}
7657
15
    },
7658
15
    {&hf_docsis_sid_cl_map_action,
7659
15
     {"...3 SID-to-Channel Mapping Action", "docsis_tlv.sid.enc.map.action",
7660
15
      FT_UINT8, BASE_DEC, VALS (sid_ch_map_vals), 0x0,
7661
15
      NULL, HFILL}
7662
15
    },
7663
#if 0
7664
    {&hf_docsis_sid_cl_so_crit,
7665
     {".3 SID Cluster Switchover Criteria", "docsis_tlv.sid.socrit",
7666
      FT_BYTES, BASE_NONE, NULL, 0x0,
7667
      NULL, HFILL}
7668
    },
7669
#endif
7670
15
    {&hf_docsis_sid_cl_so_max_req,
7671
15
     {"..1 Maximum Requests per SID Cluster", "docsis_tlv.sid.socrit.maxreq",
7672
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7673
15
      NULL, HFILL}
7674
15
    },
7675
15
    {&hf_docsis_sid_cl_so_max_out_bytes,
7676
15
     {"..2 Maximum Outstanding Bytes per SID Cluster", "docsis_tlv.sid.socrit.maxoutbytes",
7677
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7678
15
      NULL, HFILL}
7679
15
    },
7680
15
    {&hf_docsis_sid_cl_so_max_req_bytes,
7681
15
     {"..3 Maximum Total Bytes Requested per SID Cluster", "docsis_tlv.sid.socrit.maxreqbytes",
7682
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7683
15
      NULL, HFILL}
7684
15
    },
7685
15
    {&hf_docsis_sid_cl_so_max_time,
7686
15
     {"..4 Maximum Time in the SID Cluster", "docsis_tlv.sid.socrit.maxtime",
7687
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7688
15
      NULL, HFILL}
7689
15
    },
7690
#if 0
7691
    {&hf_docsis_tlv_rcp,
7692
     {"48 Receive Channel Profile", "docsis_tlv.rcp",
7693
      FT_BYTES, BASE_NONE, NULL, 0x0,
7694
      NULL, HFILL}
7695
    },
7696
#endif
7697
15
    {&hf_docsis_tlv_rcp_id,
7698
15
     {".1 RCP-ID", "docsis_tlv.rcp.id",
7699
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7700
15
      NULL, HFILL}
7701
15
    },
7702
15
    {&hf_docsis_tlv_rcp_name,
7703
15
     {".2 RCP Name", "docsis_tlv.rcp.name",
7704
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7705
15
      NULL, HFILL}
7706
15
    },
7707
15
    {&hf_docsis_tlv_rcp_freq_spc,
7708
15
     {".3 RCP Center Frequency Spacing", "docsis_tlv.rcp.freq_spc",
7709
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7710
15
      NULL, HFILL}
7711
15
    },
7712
#if 0
7713
    {&hf_docsis_tlv_rcp_rcv_mod_enc,
7714
     {".4 Receive Module Capability", "docsis_tlv.rcp.rcv_mod_enc",
7715
      FT_BYTES, BASE_NONE, NULL, 0x0,
7716
      "Receive Module Encoding", HFILL}
7717
    },
7718
#endif
7719
15
    {&hf_docsis_rcv_mod_enc_idx,
7720
15
     {"..1 Receive Module Index", "docsis_tlv.rcp.rcv_mod_enc.idx",
7721
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7722
15
      NULL, HFILL}
7723
15
    },
7724
15
    {&hf_docsis_rcv_mod_enc_adj_ch,
7725
15
     {"..2 Adjacent Channels", "docsis_tlv.rcp.rcv_mod_enc.adj_ch",
7726
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7727
15
      NULL, HFILL}
7728
15
    },
7729
#if 0
7730
    {&hf_docsis_rcv_mod_enc_ch_bl_rng,
7731
     {"..3 Channel Block Range", "docsis_tlv.rcp.rcv_mod_enc.ch_bl_rng",
7732
      FT_BYTES, BASE_NONE, NULL, 0x0,
7733
      NULL, HFILL}
7734
    },
7735
#endif
7736
15
    {&hf_docsis_rcv_mod_enc_ctr_freq_asgn,
7737
15
     {"..4 First Channel Center Frequency Assignment", "docsis_tlv.rcv_mod_enc.ctr_freq_asgn",
7738
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7739
15
      NULL, HFILL}
7740
15
    },
7741
15
    {&hf_docsis_ch_bl_rng_min_ctr_freq,
7742
15
     {"...1 Minimum Center Frequency", "docsis_tlv.rcp.rcv_mod_enc.ch_bl_rng.min_ctr_freq",
7743
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7744
15
      NULL, HFILL}
7745
15
    },
7746
15
    {&hf_docsis_ch_bl_rng_max_ctr_freq,
7747
15
     {"...2 Maximum Center Frequency", "docsis_tlv.rcp.rcv_mod_enc.ch_bl_rng.max_ctr_freq",
7748
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7749
15
      NULL, HFILL}
7750
15
    },
7751
15
    {&hf_docsis_rcv_mod_enc_rsq_ch_subs_cap ,
7752
15
     {"..5 Resequencing Channel Subset Capability", "docsis_tlv.rcp.rcv_mod_enc.rsq_ch_subs_cap",
7753
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7754
15
      NULL, HFILL}
7755
15
    },
7756
15
    {&hf_docsis_rcv_mod_enc_conn ,
7757
15
     {"..6 Receive Module Connectivity", "docsis_tlv.rcp.rcv_mod_enc.conn",
7758
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7759
15
      NULL, HFILL}
7760
15
    },
7761
15
    {&hf_docsis_rcv_mod_enc_phy_layr_parms,
7762
15
     {"..7 Physical Layer Parameter", "docsis_tlv.rcp.rcv_mod_enc.phy_layr_parms",
7763
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7764
15
      NULL, HFILL}
7765
15
    },
7766
#if 0
7767
    {&hf_docsis_tlv_rcp_rcv_ch,
7768
     {".5 Receive Channel", "docsis_tlv.rcp.rcv_ch",
7769
      FT_BYTES, BASE_NONE, NULL, 0x0,
7770
      NULL, HFILL}
7771
    },
7772
#endif
7773
15
    {&hf_docsis_rcv_ch_idx,
7774
15
     {"..1 Receive Channel Index", "docsis_tlv.rcp.rcv_ch.idx",
7775
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7776
15
      NULL, HFILL}
7777
15
    },
7778
15
    {&hf_docsis_rcv_ch_conn,
7779
15
     {"..2 Receive Channel Connectivity", "docsis_tlv.rcp.rcv_ch.conn",
7780
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7781
15
      NULL, HFILL}
7782
15
    },
7783
15
    {&hf_docsis_rcv_ch_conn_off,
7784
15
     {"..3 Receive Channel Connected Offset", "docsis_tlv.rcp.rcv_ch.conn_off",
7785
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7786
15
      NULL, HFILL}
7787
15
    },
7788
15
    {&hf_docsis_rcv_ch_prim_ds_ch_ind,
7789
15
     {"..5 Primary Downstream Channel Indicator", "docsis_tlv.rcp.rcv_ch.prim_ds_ch_ind",
7790
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7791
15
      NULL, HFILL}
7792
15
    },
7793
#if 0
7794
    {&hf_docsis_tlv_rcp_ven_spec,
7795
     {".43 Vendor Specific Encodings", "docsis_tlv.rcp.vendorspec",
7796
      FT_BYTES, BASE_NONE, NULL, 0x0,
7797
      NULL, HFILL}
7798
    },
7799
    {&hf_docsis_tlv_rcc,
7800
     {"49 Receive Channel Configuration", "docsis_tlv.rcc",
7801
      FT_BYTES, BASE_NONE, NULL, 0x0,
7802
      NULL, HFILL}
7803
    },
7804
#endif
7805
15
    {&hf_docsis_tlv_rcc_id,
7806
15
     {".1 Assigned RCP-ID", "docsis_tlv.rcc.id",
7807
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7808
15
      NULL, HFILL}
7809
15
    },
7810
#if 0
7811
    {&hf_docsis_tlv_rcc_rcv_mod_enc,
7812
     {".4 Receive Module Assignment", "docsis_tlv.rcc.rcv_mod_enc",
7813
      FT_BYTES, BASE_NONE, NULL, 0x0,
7814
      NULL, HFILL}
7815
    },
7816
#endif
7817
15
    {&hf_docsis_rcc_rcv_mod_enc_idx,
7818
15
     {"..1 Receive Module Index", "docsis_tlv.rcc.rcc_rcv_mod_enc.idx",
7819
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7820
15
      NULL, HFILL}
7821
15
    },
7822
15
    {&hf_docsis_rcc_rcv_mod_enc_ctr_freq_asgn,
7823
15
     {"..4 First Channel Center Frequency Assignment", "docsis_tlv.rcc.rcv_mod_enc.ctr_freq_asgn",
7824
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7825
15
      NULL, HFILL}
7826
15
    },
7827
15
    {&hf_docsis_rcc_rcv_mod_enc_conn ,
7828
15
     {"..6 Receive Module Connectivity", "docsis_tlv.rcc.rcv_mod_enc.conn",
7829
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7830
15
      NULL, HFILL}
7831
15
    },
7832
#if 0
7833
    {&hf_docsis_tlv_rcc_rcv_ch,
7834
     {".5 Receive Channel", "docsis_tlv.rcc.rcv_ch",
7835
      FT_BYTES, BASE_NONE, NULL, 0x0,
7836
      NULL, HFILL}
7837
    },
7838
#endif
7839
15
    {&hf_docsis_rcc_rcv_ch_idx,
7840
15
     {"..1 Receive Channel Index", "docsis_tlv.rcc.rcv_ch.idx",
7841
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7842
15
      NULL, HFILL}
7843
15
    },
7844
15
    {&hf_docsis_rcc_rcv_ch_conn,
7845
15
     {"..2 Receive Channel Connectivity", "docsis_tlv.rcc.rcv_ch.conn",
7846
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7847
15
      NULL, HFILL}
7848
15
    },
7849
15
    {&hf_docsis_rcc_rcv_ch_ctr_freq_asgn,
7850
15
     {"..4 Receive Channel Center Frequency Assignment", "docsis_tlv.rcc.rcv_ch.ctr_freq_asgn",
7851
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
7852
15
      NULL, HFILL}
7853
15
    },
7854
15
    {&hf_docsis_rcc_rcv_ch_prim_ds_ch_ind,
7855
15
     {"..5 Primary Downstream Channel Indicator", "docsis_tlv.rcc.rcv_ch.prim_ds_ch_ind",
7856
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7857
15
      NULL, HFILL}
7858
15
    },
7859
#if 0
7860
    {&hf_docsis_tlv_rcc_part_serv_ds_ch,
7861
     {".6 Partial Service Downstream Channels", "docsis_tlv.rcc.part_serv_ds_ch",
7862
      FT_BYTES, BASE_NONE, NULL, 0x0,
7863
      NULL, HFILL}
7864
    },
7865
    {&hf_docsis_tlv_rcc_ven_spec,
7866
     {".43 Vendor Specific Encodings", "docsis_tlv.rcc.vendorspec",
7867
      FT_BYTES, BASE_NONE, NULL, 0x0,
7868
      NULL, HFILL}
7869
    },
7870
    {&hf_docsis_tlv_rcc_err,
7871
     {".254 RCC Error Encodings", "docsis_tlv.rcc.err",
7872
      FT_BYTES, BASE_NONE, NULL, 0x0,
7873
      NULL, HFILL}
7874
    },
7875
#endif
7876
15
    {&hf_docsis_tlv_rcc_partial_serv_down_chan_id,
7877
15
     {"Downstream Channel ID", "docsis_tlv.rcc.partial_serv_down_chan.ds_ch_id",
7878
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7879
15
      NULL, HFILL}
7880
15
    },
7881
15
    {&hf_docsis_tlv_rcc_srcc_prim_ds_chan_assign_ds_ch_id,
7882
15
     {"Downstream Channel ID", "docsis_tlv.rcc.srcc.prim_ds_chann_assign.ds_ch_id",
7883
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7884
15
      NULL, HFILL}
7885
15
    },
7886
15
    {&hf_docsis_tlv_rcc_srcc_ds_chan_assign_ds_ch_id,
7887
15
     {"Downstream Channel ID", "docsis_tlv.rcc.srcc.ds_chann_assign.ds_ch_id",
7888
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7889
15
      NULL, HFILL}
7890
15
    },
7891
15
    {&hf_docsis_tlv_rcc_srcc_ds_prof_assign_dcid,
7892
15
     {"....1 DCID", "docsis_tlv.rcc.srcc.ds_prof_assign.prof_list.dcid",
7893
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7894
15
      NULL, HFILL}
7895
15
    },
7896
15
    {&hf_docsis_tlv_rcc_srcc_ds_prof_asssign_prof_list_prof_id,
7897
15
     {"Profile ID", "docsis_tlv.rcc.srcc.ds_prof_assign.prof_list.prof_id",
7898
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7899
15
      NULL, HFILL}
7900
15
    },
7901
15
    {&hf_docsis_tlv_rcc_prim_down_chan,
7902
15
     {".8 Primary Downstream Channel", "docsis_tlv.rcc.prim_down_chan",
7903
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7904
15
      NULL, HFILL}
7905
15
    },
7906
15
    {&hf_docsis_tlv_rcc_err_mod_or_ch,
7907
15
     {".1 Receive Modul or Receive Channel", "docsis_tlv.rcc.err.mod_or_ch",
7908
15
      FT_UINT8, BASE_DEC, VALS (mod_or_ch_vals), 0x0,
7909
15
      NULL, HFILL}
7910
15
    },
7911
15
    {&hf_docsis_tlv_rcc_err_idx,
7912
15
     {".2 Receive Modul/Channel Index", "docsis_tlv.rcc.err.idx",
7913
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7914
15
      NULL, HFILL}
7915
15
    },
7916
15
    {&hf_docsis_tlv_rcc_err_param,
7917
15
     {".3 Reported Parameter", "docsis_tlv.rcc.err.param",
7918
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7919
15
      NULL, HFILL}
7920
15
    },
7921
15
    {&hf_docsis_tlv_rcc_err_code,
7922
15
     {".4 Error Code", "docsis_tlv.rcc.err.code",
7923
15
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
7924
15
      NULL, HFILL}
7925
15
    },
7926
15
    {&hf_docsis_tlv_rcc_err_msg,
7927
15
     {".5 Error Message", "docsis_tlv.rcc.err.msg",
7928
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7929
15
      NULL, HFILL}
7930
15
    },
7931
#if 0
7932
    {&hf_docsis_tlv_dsid,
7933
     {"50 DSID Encodings", "docsis_tlv.dsid",
7934
      FT_BYTES, BASE_NONE, NULL, 0x0,
7935
      NULL, HFILL}
7936
    },
7937
#endif
7938
15
    {&hf_docsis_tlv_dsid_id,
7939
15
     {".1 Downstream Service Identifier (DSID)", "docsis_tlv.dsid.id",
7940
15
      FT_UINT24, BASE_DEC, NULL, 0x0,
7941
15
      NULL, HFILL}
7942
15
    },
7943
15
    {&hf_docsis_tlv_dsid_action,
7944
15
     {".2 DSID Action", "docsis_tlv.dsid.action",
7945
15
      FT_UINT8, BASE_DEC, VALS (dsid_action_vals), 0x0,
7946
15
      NULL, HFILL}
7947
15
    },
7948
#if 0
7949
    {&hf_docsis_tlv_dsid_ds_reseq,
7950
     {".3 Downstream Resequencing Encodings", "docsis_tlv.dsid.ds_reseq",
7951
      FT_BYTES, BASE_NONE, NULL, 0x0,
7952
      NULL, HFILL}
7953
    },
7954
#endif
7955
15
    {&hf_docsis_ds_reseq_dsid,
7956
15
     {"..1 Resequencing DSID", "docsis_tlv.dsid.ds_reseq.dsid",
7957
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7958
15
      NULL, HFILL}
7959
15
    },
7960
15
    {&hf_docsis_ds_reseq_ch_lst,
7961
15
     {"..2 Downstream Resequencing Channel List", "docsis_tlv.dsid.ds_reseq.ch_lst",
7962
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
7963
15
      NULL, HFILL}
7964
15
    },
7965
15
    {&hf_docsis_ds_reseq_wait_time,
7966
15
     {"..3 Downstream Resequencing Wait Time", "docsis_tlv.dsid.ds_reseq.wait_time",
7967
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7968
15
      NULL, HFILL}
7969
15
    },
7970
15
    {&hf_docsis_ds_reseq_warn_thresh,
7971
15
     {"..4 Resequencing Warn Threshold", "docsis_tlv.dsid.ds_reseq.warn_thresh",
7972
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
7973
15
      NULL, HFILL}
7974
15
    },
7975
15
    {&hf_docsis_ds_reseq_ho_timer,
7976
15
     {"..5 CM-Status max. Event Hold-Off Timer (Out-of-Range Events)", "docsis_tlv.dsid.ds_reseq.ho_timer",
7977
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
7978
15
      NULL, HFILL}
7979
15
    },
7980
#if 0
7981
    {&hf_docsis_tlv_dsid_mc,
7982
     {".4 Multicast Encodings", "docsis_tlv.dsid.mc",
7983
      FT_BYTES, BASE_NONE, NULL, 0x0,
7984
      NULL, HFILL}
7985
    },
7986
    {&hf_docsis_tlv_dsid_mc_addr,
7987
     {"..1 Client MAC Address Encodings", "docsis_tlv.dsid.mc.addr",
7988
      FT_BYTES, BASE_NONE, NULL, 0x0,
7989
      NULL, HFILL}
7990
    },
7991
#endif
7992
15
    {&hf_docsis_mc_addr_action,
7993
15
     {"...1 Client MAC Address Action", "docsis_tlv.dsid.mc.addr.action",
7994
15
      FT_UINT8, BASE_DEC, VALS (add_del_vals), 0x0,
7995
15
      NULL, HFILL}
7996
15
    },
7997
15
    {&hf_docsis_mc_addr_addr,
7998
15
     {"...2 Client MAC Address", "docsis_tlv.dsid.mc.addr.addr",
7999
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
8000
15
      NULL, HFILL}
8001
15
    },
8002
15
    {&hf_docsis_tlv_dsid_mc_cmim,
8003
15
     {"..2 Multicast CM Interface Mask", "docsis_tlv.dsid.mc.cmim",
8004
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
8005
15
      NULL, HFILL}
8006
15
    },
8007
15
    {&hf_docsis_tlv_dsid_mc_group,
8008
15
     {"..3 Multicast Group MAC Addresses", "docsis_tlv.dsid.mc.group",
8009
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
8010
15
      NULL, HFILL}
8011
15
    },
8012
#if 0
8013
    {&hf_docsis_tlv_dsid_mc_phs,
8014
     {"..26 Payload Header Suppression Encodings", "docsis_tlv.dsid.mc.phs",
8015
      FT_BYTES, BASE_NONE, NULL, 0x0,
8016
      NULL, HFILL}
8017
    },
8018
    {&hf_docsis_tlv_sec_assoc,
8019
     {"51 Security Association Encodings", "docsis_tlv.sec_assoc",
8020
      FT_BYTES, BASE_NONE, NULL, 0x0,
8021
      NULL, HFILL}
8022
    },
8023
#endif
8024
15
    {&hf_docsis_tlv_sec_assoc_action,
8025
15
     {".1 SA Action", "docsis_tlv.sec_assoc.action",
8026
15
      FT_UINT8, BASE_DEC, VALS (add_del_vals), 0x0,
8027
15
      NULL, HFILL}
8028
15
    },
8029
15
    {&hf_docsis_tlv_sec_assoc_desc,
8030
15
     {".23 SA Descriptor", "docsis_tlv.sec_assoc.desc",
8031
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
8032
15
      NULL, HFILL}
8033
15
    },
8034
15
    {&hf_docsis_tlv_init_ch_timeout,
8035
15
     {"52 Initializing Channel Timeout", "docsis_tlv.init_ch_timeout",
8036
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
8037
15
      NULL, HFILL}
8038
15
    },
8039
#if 0
8040
    {&hf_docsis_tlv_ch_asgn,
8041
     {"56 Channel Assignment Configuration Settings", "docsis_tlv.ch_asgn",
8042
      FT_BYTES, BASE_NONE, NULL, 0x0,
8043
      NULL, HFILL}
8044
    },
8045
#endif
8046
15
    {&hf_docsis_ch_asgn_us_ch_id,
8047
15
     {".1 Upstream Channel ID", "docsis_tlv.ch_asgn.us_ch_id",
8048
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
8049
15
      NULL, HFILL}
8050
15
    },
8051
15
    {&hf_docsis_ch_asgn_rx_freq,
8052
15
     {".2 Rx Frequency", "docsis_tlv.ch_asgn.rx_freq",
8053
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
8054
15
      NULL, HFILL}
8055
15
    },
8056
15
    {&hf_docsis_tlv_cm_init_reason,
8057
15
     {"57 CM Initialization Reason", "docsis_tlv.cm_init_reason",
8058
15
      FT_UINT16, BASE_DEC, VALS (init_reason_vals), 0x0,
8059
15
      NULL, HFILL}
8060
15
    },
8061
15
    {&hf_docsis_tlv_sw_upg_srvr_ipv6,
8062
15
     {"58 Software Upgrade Server IPv6", "docsis_tlv.sw_upg_srvr_ipv6",
8063
15
      FT_IPv6, BASE_NONE, NULL, 0x0,
8064
15
      NULL, HFILL}
8065
15
    },
8066
15
    {&hf_docsis_tlv_tftp_prov_cm_ipv6_addr,
8067
15
     {"59 TFTP Server Provisioned Modem IPv6 Address", "docsis_tlv.tftp_prov_cm_ipv6_addr",
8068
15
      FT_IPv6, BASE_NONE, NULL, 0x0,
8069
15
      NULL, HFILL}
8070
15
    },
8071
15
    {&hf_docsis_tlv_us_drop_clfy,
8072
15
     {"60 Upstream Drop Packet Classification Encoding", "docsis_tlv.us_drop_clfy",
8073
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
8074
15
      NULL, HFILL}
8075
15
    },
8076
15
    {&hf_docsis_tlv_subs_mgmt_ipv6_lst,
8077
15
     {"61 Subscriber Management CPE IPv6 Prefix List", "docsis_tlv.subs_mgmt_ipv6_lst",
8078
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
8079
15
      NULL, HFILL}
8080
15
    },
8081
15
    {&hf_docsis_tlv_us_drop_clfy_group_id,
8082
15
     {"62 Upstream Drop Classifier Group ID", "docsis_tlv.us_drop_clfy_group_id",
8083
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
8084
15
      NULL, HFILL}
8085
15
    },
8086
15
    {&hf_docsis_tlv_subs_mgmt_ctrl_max_cpe_ipv6,
8087
15
     {"63 Subscriber Management Control Max CPE IPv6 Prefix", "docsis_tlv.subs_mgmt_ctrl_max_cpe_ipv6",
8088
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
8089
15
      NULL, HFILL}
8090
15
    },
8091
#if 0
8092
    {&hf_docsis_tlv_cmts_mc_sess_enc,
8093
     {"64 CMTS Static Multicast Session Encoding", "docsis_tlv.cmts_mc_sess_enc",
8094
      FT_BYTES, BASE_NONE, NULL, 0x0,
8095
      NULL, HFILL}
8096
    },
8097
#endif
8098
15
    {&hf_docsis_cmts_mc_sess_enc_grp,
8099
15
     {".1 Multicast Group Address", "docsis_tlv.cmts_mc_sess_enc.grp",
8100
15
      FT_IPXNET, BASE_NONE, NULL, 0x0,
8101
15
      NULL, HFILL}
8102
15
    },
8103
15
    {&hf_docsis_cmts_mc_sess_enc_src,
8104
15
     {".2 Source IP Address", "docsis_tlv.cmts_mc_sess_enc.src",
8105
15
      FT_IPXNET, BASE_NONE, NULL, 0x0,
8106
15
      NULL, HFILL}
8107
15
    },
8108
15
    {&hf_docsis_cmts_mc_sess_enc_cmim,
8109
15
     {".3 CMIM", "docsis_tlv.cmts_mc_sess_enc.cmim",
8110
15
      FT_BYTES, BASE_NONE, NULL, 0x0,
8111
15
      NULL, HFILL}
8112
15
    },
8113
15
    {&hf_docsis_tlv_em_mode_ind,
8114
15
      {"75 Energy Management Mode Indicator", "docsis_tlv.em_mode_ind",
8115
15
       FT_UINT8, BASE_DEC, VALS(em_mode_ind_vals), 0x0,
8116
15
       NULL, HFILL}
8117
15
    },
8118
15
    {&hf_docsis_tlv_em_id_list_for_cm_em_id,
8119
15
      {"Energy Management Identifier", "docsis_tlv.em_id_list_for_cm.em_id",
8120
15
       FT_UINT16, BASE_DEC, NULL, 0x0,
8121
15
       NULL, HFILL}
8122
15
    },
8123
15
    {&hf_docsis_tlv_fdx_tg_assignment_tg_id,
8124
15
      {"Transmission Group ID", "docsis_tlv.fdx_tg_assignment_tg_id",
8125
15
       FT_UINT8, BASE_DEC, NULL, 0x0,
8126
15
       NULL, HFILL}
8127
15
    },
8128
15
    {&hf_docsis_tlv_fdx_tg_assignment_rba_type,
8129
15
      {"RBA Type", "docsis_tlv.fdx_tg_assignment_rba_type",
8130
15
       FT_UINT8, BASE_DEC, VALS (rba_type_vals), 0x0,
8131
15
       NULL, HFILL}
8132
15
    },
8133
15
    {&hf_docsis_tlv_fdx_reset,
8134
15
     {"86 FDX Reset", "docsis_tlv.fdx_reset",
8135
15
      FT_UINT8, BASE_DEC, VALS (fdx_reset_vals), 0x0,
8136
15
      NULL, HFILL}
8137
15
    },
8138
15
    {&hf_docsis_tlv_unknown,
8139
15
      {"Unknown TLV", "docsis_tlv.unknown",
8140
15
       FT_BYTES, BASE_NONE, NULL, 0x0,
8141
15
       NULL, HFILL}
8142
15
    },
8143
15
    {&hf_docsis_tlv_unknown_type,
8144
15
      {"Type", "docsis_tlv.unknown.type",
8145
15
       FT_UINT8, BASE_DEC, NULL, 0x0,
8146
15
       NULL, HFILL}
8147
15
    },
8148
15
    {&hf_docsis_tlv_unknown_length,
8149
15
      {"Length", "docsis_tlv.unknown.length",
8150
15
       FT_UINT8, BASE_DEC, NULL, 0x0,
8151
15
       NULL, HFILL}
8152
15
    },
8153
15
    {&hf_docsis_tlv_unknown_value,
8154
15
      {"Value", "docsis_tlv.unknown.value",
8155
15
       FT_BYTES, BASE_NONE, NULL, 0x0,
8156
15
       NULL, HFILL}
8157
15
    },
8158
15
    { &hf_docsis_ucd_fragment_overlap,
8159
15
     { "Fragment overlap", "docsis_tlv.ucd.fragment.overlap",
8160
15
       FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8161
15
       "Fragment overlaps with other fragments", HFILL}
8162
15
    },
8163
15
    { &hf_docsis_ucd_fragment_overlap_conflict,
8164
15
     { "Conflicting data in fragment overlap", "docsis_tlv.ucd.fragment.overlap.conflict",
8165
15
       FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8166
15
       "Overlapping fragments contained conflicting data", HFILL}
8167
15
    },
8168
15
    { &hf_docsis_ucd_fragment_multiple_tails,
8169
15
     { "Multiple tail fragments found", "docsis_tlv.ucd.fragment.multipletails",
8170
15
       FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8171
15
       "Several tails were found when defragmenting the packet", HFILL}
8172
15
    },
8173
15
    { &hf_docsis_ucd_fragment_too_long_fragment,
8174
15
     { "Fragment too long", "docsis_tlv.ucd.fragment.toolongfragment",
8175
15
       FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8176
15
       "Fragment contained data past end of packet", HFILL}
8177
15
    },
8178
15
    { &hf_docsis_ucd_fragment_error,
8179
15
     { "Defragmentation error", "docsis_tlv.ucd.fragment.error",
8180
15
       FT_FRAMENUM, BASE_NONE, NULL, 0x0,
8181
15
       "Defragmentation error due to illegal fragments", HFILL}
8182
15
    },
8183
15
    { &hf_docsis_ucd_fragment_count,
8184
15
     { "Fragment count", "docsis_tlv.ucd.fragment.count",
8185
15
       FT_UINT32, BASE_DEC, NULL, 0x0,
8186
15
       NULL, HFILL}
8187
15
    },
8188
15
    { &hf_docsis_ucd_fragment,
8189
15
     { "UCD Fragment", "docsis_tlv.ucd.fragment",
8190
15
       FT_FRAMENUM, BASE_NONE, NULL, 0x0,
8191
15
       NULL, HFILL}
8192
15
    },
8193
15
    { &hf_docsis_ucd_fragments,
8194
15
     { "UCD Fragments", "docsis_tlv.ucd.fragments",
8195
15
       FT_BYTES, BASE_NONE, NULL, 0x0,
8196
15
       NULL, HFILL}
8197
15
    },
8198
15
    { &hf_docsis_ucd_reassembled_in,
8199
15
     { "Reassembled UCD in frame", "docsis_tlv.ucd.reassembled_in",
8200
15
       FT_FRAMENUM, BASE_NONE, NULL, 0x0,
8201
15
       "This UCD packet is reassembled in this frame", HFILL}
8202
15
    },
8203
15
    { &hf_docsis_ucd_reassembled_length,
8204
15
     { "Reassembled UCD length", "docsis_tlv.ucd.reassembled.length",
8205
15
       FT_UINT32, BASE_DEC, NULL, 0x0,
8206
15
       "The total length of the reassembled payload", HFILL}
8207
15
    },
8208
15
    { &hf_docsis_ucd_reassembled_data,
8209
15
     { "Reassembled UCD data", "docsis_tlv.ucd.reassembled.data",
8210
15
       FT_BYTES, BASE_NONE, NULL, 0x0,
8211
15
       "The reassembled payload", HFILL}
8212
15
    },
8213
15
    { &hf_docsis_ucd_reassembled,
8214
15
     { ".5 Reassembled UCD", "docsis_tlv.ucd.reassembled",
8215
15
       FT_BYTES, BASE_NONE, NULL, 0x0,
8216
15
       "The reassembled UCD", HFILL}
8217
15
    },
8218
8219
15
  };
8220
8221
15
  static int *ett[] = {
8222
15
    &ett_docsis_tlv,
8223
15
    &ett_docsis_tlv_cos,
8224
15
    &ett_docsis_tlv_mcap,
8225
15
    &ett_docsis_tlv_mcap_em,
8226
15
    &ett_docsis_tlv_mcap_em_pref,
8227
15
    &ett_docsis_tlv_mcap_ofdm_chan_subc_qam_mod_sup,
8228
15
    &ett_docsis_tlv_mcap_ofdma_chan_subc_qam_mod_sup,
8229
15
    &ett_docsis_tlv_mcap_down_lower_band_edge_conf,
8230
15
    &ett_docsis_tlv_mcap_down_upper_band_edge_conf,
8231
15
    &ett_docsis_tlv_mcap_dipl_down_lower_band_edge,
8232
15
    &ett_docsis_tlv_mcap_dipl_down_upper_band_edge,
8233
15
    &ett_docsis_tlv_mcap_dipl_up_upper_band_edge,
8234
15
    &ett_docsis_tlv_mcap_advanced_band_plan,
8235
15
    &ett_docsis_tlv_mcap_dipl_down_lower_band_edge_options_list,
8236
15
    &ett_docsis_tlv_mcap_dipl_down_upper_band_edge_options_list,
8237
15
    &ett_docsis_tlv_mcap_dipl_up_upper_band_edge_options_list,
8238
15
    &ett_docsis_tlv_clsfr,
8239
15
    &ett_docsis_tlv_clsfr_ip,
8240
15
    &ett_docsis_tlv_clsfr_ip6,
8241
15
    &ett_docsis_tlv_clsfr_ip6_tc,
8242
15
    &ett_docsis_tlv_clsfr_eth,
8243
15
    &ett_docsis_tlv_clsfr_err,
8244
15
    &ett_docsis_tlv_clsfr_dot1q,
8245
15
    &ett_docsis_tlv_reqxmitpol,
8246
15
    &ett_docsis_tlv_sflow_err,
8247
15
    &ett_docsis_tlv_phs,
8248
15
    &ett_docsis_tlv_phs_err,
8249
15
    &ett_docsis_tlv_svc_unavail,
8250
15
    &ett_docsis_tlv_snmpv3_kick,
8251
15
    &ett_docsis_tlv_ds_ch_list,
8252
15
    &ett_docsis_tlv_ds_ch_list_single,
8253
15
    &ett_docsis_tlv_ds_ch_list_range,
8254
15
    &ett_docsis_tlv_ext_field,
8255
15
    &ett_docsis_tlv_vendor_specific_cap,
8256
15
    &ett_docsis_tlv_dut_filter,
8257
15
    &ett_docsis_tlv_tcc,
8258
15
    &ett_docsis_tlv_tcc_ucd,
8259
15
    &ett_docsis_tlv_tcc_rng_parms,
8260
15
    &ett_docsis_tlv_tcc_oudp,
8261
15
    &ett_docsis_tlv_tcc_err,
8262
15
    &ett_docsis_tlv_sid_cl,
8263
15
    &ett_docsis_tlv_sid_cl_enc,
8264
15
    &ett_docsis_tlv_sid_cl_enc_map,
8265
15
    &ett_docsis_tlv_sid_cl_so,
8266
15
    &ett_docsis_tlv_rcp,
8267
15
    &ett_docsis_tlv_rcp_rcv_mod_enc,
8268
15
    &ett_docsis_tlv_rcp_ch_bl_rng,
8269
15
    &ett_docsis_tlv_rcp_rcv_ch,
8270
15
    &ett_docsis_tlv_rcc,
8271
15
    &ett_docsis_tlv_rcc_rcv_mod_enc,
8272
15
    &ett_docsis_tlv_rcc_rcv_ch,
8273
15
    &ett_docsis_tlv_rcc_partial_serv_down_chan,
8274
15
    &ett_docsis_tlv_rcc_srcc,
8275
15
    &ett_docsis_tlv_rcc_srcc_prim_ds_assign,
8276
15
    &ett_docsis_tlv_rcc_srcc_ds_assign,
8277
15
    &ett_docsis_tlv_rcc_srcc_ds_prof_assign,
8278
15
    &ett_docsis_tlv_rcc_srcc_ds_prof_assign_prof_list,
8279
15
    &ett_docsis_tlv_rcc_err,
8280
15
    &ett_docsis_tlv_dsid,
8281
15
    &ett_docsis_tlv_dsid_ds_reseq,
8282
15
    &ett_docsis_tlv_dsid_mc,
8283
15
    &ett_docsis_tlv_dsid_mc_addr,
8284
15
    &ett_docsis_tlv_sec_assoc,
8285
15
    &ett_docsis_tlv_ch_asgn,
8286
15
    &ett_docsis_cmts_mc_sess_enc,
8287
15
    &ett_docsis_em_id_list_for_cm,
8288
15
    &ett_docsis_tlv_tg_assignment,
8289
15
    &ett_docsis_tlv_unknown,
8290
15
    &ett_docsis_ucd_fragment,
8291
15
    &ett_docsis_ucd_fragments,
8292
15
    &ett_docsis_ucd_reassembled,
8293
15
  };
8294
8295
15
  static ei_register_info ei[] = {
8296
15
    {&ei_docsis_tlv_tlvlen_bad, { "docsis_tlv.tlvlenbad", PI_MALFORMED, PI_ERROR, "Bad TLV length", EXPFILL}},
8297
15
    {&ei_docsis_tlv_tlvval_bad, { "docsis_tlv.tlvvalbad", PI_PROTOCOL, PI_WARN, "Wrong TLV value", EXPFILL}},
8298
15
  };
8299
8300
15
  expert_module_t* expert_docsis_tlv;
8301
8302
15
  proto_docsis_tlv = proto_register_protocol ("DOCSIS Appendix C TLVs", "DOCSIS TLVs", "docsis_tlv");
8303
8304
15
  proto_register_field_array (proto_docsis_tlv, hf, array_length (hf));
8305
15
  proto_register_subtree_array (ett, array_length (ett));
8306
15
  expert_docsis_tlv = expert_register_protocol(proto_docsis_tlv);
8307
15
  expert_register_field_array(expert_docsis_tlv, ei, array_length(ei));
8308
8309
15
  register_dissector ("docsis_tlv", dissect_docsis_tlv, proto_docsis_tlv);
8310
15
}
8311
8312
void
8313
proto_reg_handoff_docsis_tlv (void)
8314
15
{
8315
#if 0
8316
  dissector_handle_t docsis_tlv_handle;
8317
8318
  docsis_tlv_handle = find_dissector ("docsis_tlv");
8319
  dissector_add_uint ("docsis", 0xFF, docsis_tlv_handle);
8320
#endif
8321
8322
15
  docsis_vsif_handle = find_dissector("docsis_vsif");
8323
15
  docsis_ucd_handle = find_dissector("docsis_ucd");
8324
15
  docsis_rba_handle = find_dissector("docsis_rba");
8325
8326
15
  reassembly_table_register(&ucd_reassembly_table,
8327
15
                        &addresses_reassembly_table_functions);
8328
8329
8330
15
}
8331
8332
/*
8333
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
8334
 *
8335
 * Local Variables:
8336
 * c-basic-offset: 2
8337
 * tab-width: 8
8338
 * indent-tabs-mode: nil
8339
 * End:
8340
 *
8341
 * ex: set shiftwidth=2 tabstop=8 expandtab:
8342
 * :indentSize=2:tabSize=8:noTabs=true:
8343
 */