1 /* packet-macmgmt.c
2  * Routines for DOCSIS MAC Management Header dissection
3  * Routines for Upstream Channel Change dissection
4  * Routines for Ranging Message dissection
5  * Routines for Registration Message dissection
6  * Routines for Baseline Privacy Key Management Message dissection
7  * Routines for Dynamic Service Addition Message dissection
8  * Routines for Dynamic Service Change Request dissection
9  * Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
10  *
11  * Routines for Type 2 UCD Message dissection
12  * Copyright 2015, Adrian Simionov <daniel.simionov@gmail.com>
13  * Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
14  *
15  * Routines for Sync Message dissection
16  * Routines for REG-REQ-MP dissection
17  * Copyright 2007, Bruno Verstuyft  <bruno.verstuyft@excentis.com>
18  *
19  * Routines for DOCSIS 3.1 OFDM Channel Descriptor dissection.
20  * Routines for DOCSIS 3.1 Downstream Profile Descriptor dissection.
21  * Routines for Type 51 UCD - DOCSIS 3.1 only - Message dissection
22  * Copyright 2016, Bruno Verstuyft <bruno.verstuyft@excentis.com>
23  *
24  * Routines for DCC Message dissection
25  * Routines for DCD Message dissection
26  * Copyright 2004, Darryl Hymel <darryl.hymel[AT]arrisi.com>
27  *
28  * Routines for Type 29 UCD - DOCSIS 2.0 only - Message dissection
29  * Copyright 2015, Adrian Simionov <daniel.simionov@gmail.com>
30  * Copyright 2003, Brian Wheeler <brian.wheeler[AT]arrisi.com>
31  *
32  * Routines for Intial Ranging Request Message dissection
33  * Copyright 2003, Brian Wheeler <brian.wheeler[AT]arrisi.com>
34  *
35  * Routines for Baseline Privacy Key Management Attributes dissection
36  * Copyright 2017, Adrian Simionov <daniel.simionov@gmail.com>
37  * Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
38  *
39  * Routines for MDD Message dissection
40  * Copyright 2014, Adrian Simionov <adrian.simionov@arrisi.com>
41  * Copyright 2007, Bruno Verstuyft <bruno.verstuyft@excentis.com>
42  *
43  * Routines for DOCSIS 3.0 Bonded Intial Ranging Request Message dissection.
44  * Copyright 2009, Geoffrey Kimball <gekimbal[AT]cisco.com>
45  *
46  * Routines for Type 35 UCD - DOCSIS 3.0 only - Message dissection
47  * Copyright 2015, Adrian Simionov <daniel.simionov@gmail.com>
48  *
49  * Routines for DOCSIS 3.0 Dynamic Bonding Change Message dissection.
50  * Routines for DOCSIS 3.0 DOCSIS Path Verify Message dissection.
51  * Routines for DOCSIS 3.0 CM Control Message dissection.
52  * Copyright 2010, Guido Reismueller <g.reismueller[AT]avm.de>
53  *
54  * Wireshark - Network traffic analyzer
55  * By Gerald Combs <gerald@wireshark.org>
56  * Copyright 1998 Gerald Combs
57  *
58  * SPDX-License-Identifier: GPL-2.0-or-later
59  */
60 
61 #include "config.h"
62 
63 #include <epan/packet.h>
64 #include <epan/expert.h>
65 #include <wsutil/utf8_entities.h>
66 #include "packet-docsis-tlv.h"
67 #include <epan/reassemble.h>
68 #include <epan/proto_data.h>
69 
70 void proto_register_docsis_mgmt(void);
71 void proto_reg_handoff_docsis_mgmt(void);
72 
73 #define MGT_SYNC 1
74 #define MGT_UCD 2
75 #define MGT_MAP 3
76 #define MGT_RNG_REQ 4
77 #define MGT_RNG_RSP 5
78 #define MGT_REG_REQ 6
79 #define MGT_REG_RSP 7
80 #define MGT_UCC_REQ 8
81 #define MGT_UCC_RSP 9
82 #define MGT_TRI_TCD 10
83 #define MGT_TRI_TSI 11
84 #define MGT_BPKM_REQ 12
85 #define MGT_BPKM_RSP 13
86 #define MGT_REG_ACK 14
87 #define MGT_DSA_REQ 15
88 #define MGT_DSA_RSP 16
89 #define MGT_DSA_ACK 17
90 #define MGT_DSC_REQ 18
91 #define MGT_DSC_RSP 19
92 #define MGT_DSC_ACK 20
93 #define MGT_DSD_REQ 21
94 #define MGT_DSD_RSP 22
95 #define MGT_DCC_REQ 23
96 #define MGT_DCC_RSP 24
97 #define MGT_DCC_ACK 25
98 #define MGT_DCI_REQ 26
99 #define MGT_DCI_RSP 27
100 #define MGT_UP_DIS 28
101 #define MGT_TYPE29UCD 29
102 #define MGT_INIT_RNG_REQ 30
103 #define MGT_TEST_REQ 31
104 #define MGT_DS_CH_DESC 32
105 #define MGT_MDD 33
106 #define MGT_B_INIT_RNG_REQ 34
107 #define MGT_TYPE35UCD 35
108 #define MGT_DBC_REQ 36
109 #define MGT_DBC_RSP 37
110 #define MGT_DBC_ACK 38
111 #define MGT_DPV_REQ 39
112 #define MGT_DPV_RSP 40
113 #define MGT_CM_STATUS 41
114 #define MGT_CM_CTRL_REQ 42
115 #define MGT_CM_CTRL_RSP 43
116 #define MGT_REG_REQ_MP 44
117 #define MGT_REG_RSP_MP 45
118 #define MGT_EM_REQ 46
119 #define MGT_EM_RSP 47
120 #define MGT_CM_STATUS_ACK 48
121 #define MGT_OCD 49
122 #define MGT_DPD 50
123 #define MGT_TYPE51UCD 51
124 #define MGT_ODS_REQ 52
125 #define MGT_ODS_RSP 53
126 #define MGT_OPT_REQ 54
127 #define MGT_OPT_RSP 55
128 #define MGT_OPT_ACK 56
129 #define MGT_DPT_REQ 57
130 #define MGT_DPT_RSP 58
131 #define MGT_DPT_ACK 59
132 #define MGT_DPT_INFO 60
133 #define MGT_RBA_SW 61
134 
135 #define UCD_SYMBOL_RATE 1
136 #define UCD_FREQUENCY 2
137 #define UCD_PREAMBLE 3
138 #define UCD_BURST_DESCR 4
139 #define UCD_BURST_DESCR5 5
140 #define UCD_EXT_PREAMBLE 6
141 #define UCD_SCDMA_MODE_ENABLED 7
142 #define UCD_SCDMA_SPREADING_INTERVAL 8
143 #define UCD_SCDMA_CODES_PER_MINI_SLOT 9
144 #define UCD_SCDMA_ACTIVE_CODES 10
145 #define UCD_SCDMA_CODE_HOPPING_SEED 11
146 #define UCD_SCDMA_US_RATIO_NUM 12
147 #define UCD_SCDMA_US_RATIO_DENOM 13
148 #define UCD_SCDMA_TIMESTAMP_SNAPSHOT 14
149 #define UCD_MAINTAIN_POWER_SPECTRAL_DENSITY 15
150 #define UCD_RANGING_REQUIRED 16
151 #define UCD_MAX_SCHEDULED_CODES 17
152 #define UCD_RANGING_HOLD_OFF_PRIORITY_FIELD 18
153 #define UCD_RANGING_CHANNEL_CLASS_ID 19
154 #define UCD_SCDMA_SELECTION_ACTIVE_CODES_AND_CODE_HOPPING 20
155 #define UCD_SCDMA_SELECTION_STRING_FOR_ACTIVE_CODES 21
156 #define UCD_HIGHER_UCD_FOR_SAME_UCID 22
157 #define UCD_BURST_DESCR23 23
158 #define UCD_CHANGE_IND_BITMASK 24
159 #define UCD_OFDMA_TIMESTAMP_SNAPSHOT 25
160 #define UCD_OFDMA_CYCLIC_PREFIX_SIZE 26
161 #define UCD_OFDMA_ROLLOFF_PERIOD_SIZE 27
162 #define UCD_SUBCARRIER_SPACING 28
163 #define UCD_CENTER_FREQ_SUBC_0 29
164 #define UCD_SUBC_EXCL_BAND 30
165 #define UCD_UNUSED_SUBC_SPEC 31
166 #define UCD_SYMB_IN_OFDMA_FRAME 32
167 #define UCD_RAND_SEED 33
168 
169 #define UCD_MODULATION 1
170 #define UCD_DIFF_ENCODING 2
171 #define UCD_PREAMBLE_LEN 3
172 #define UCD_PREAMBLE_VAL_OFF 4
173 #define UCD_FEC 5
174 #define UCD_FEC_CODEWORD 6
175 #define UCD_SCRAMBLER_SEED 7
176 #define UCD_MAX_BURST 8
177 #define UCD_GUARD_TIME 9
178 #define UCD_LAST_CW_LEN 10
179 #define UCD_SCRAMBLER_ONOFF 11
180 #define UCD_RS_INT_DEPTH 12
181 #define UCD_RS_INT_BLOCK 13
182 #define UCD_PREAMBLE_TYPE 14
183 #define UCD_SCMDA_SCRAMBLER_ONOFF 15
184 #define UCD_SCDMA_CODES_PER_SUBFRAME 16
185 #define UCD_SCDMA_FRAMER_INT_STEP_SIZE 17
186 #define UCD_TCM_ENABLED 18
187 #define UCD_SUBC_INIT_RANG 19
188 #define UCD_SUBC_FINE_RANG 20
189 #define UCD_OFDMA_PROFILE 21
190 #define UCD_OFDMA_IR_POWER_CONTROL 22
191 
192 #define IUC_REQUEST 1
193 #define IUC_REQ_DATA 2
194 #define IUC_INIT_MAINT 3
195 #define IUC_STATION_MAINT 4
196 #define IUC_SHORT_DATA_GRANT 5
197 #define IUC_LONG_DATA_GRANT 6
198 #define IUC_NULL_IE 7
199 #define IUC_DATA_ACK 8
200 #define IUC_ADV_PHY_SHORT_DATA_GRANT 9
201 #define IUC_ADV_PHY_LONG_DATA_GRANT 10
202 #define IUC_ADV_PHY_UGS 11
203 #define IUC_DATA_PROFILE_IUC12 12
204 #define IUC_DATA_PROFILE_IUC13 13
205 #define IUC_RESERVED14 14
206 #define IUC_EXPANSION 15
207 
208 #define MAP_v1 1
209 #define MAP_v5 5
210 
211 #define RNGRSP_TIMING 1
212 #define RNGRSP_PWR_LEVEL_ADJ 2
213 #define RNGRSP_OFFSET_FREQ_ADJ 3
214 #define RNGRSP_TRANSMIT_EQ_ADJ 4
215 #define RNGRSP_RANGING_STATUS 5
216 #define RNGRSP_DOWN_FREQ_OVER 6
217 #define RNGRSP_UP_CHID_OVER 7
218 #define RNGRSP_TRANSMIT_EQ_SET 9
219 #define RNGRSP_T4_TIMEOUT_MULTIPLIER 13
220 #define RNGRSP_DYNAMIC_RANGE_WINDOW_UPPER_EDGE 14
221 #define RNGRSP_TRANSMIT_EQ_ADJUST_OFDMA_CHANNELS 15
222 #define RNGRSP_TRANSMIT_EQ_SET_OFDMA_CHANNELS 16
223 #define RNGRSP_COMMANDED_POWER 17
224 
225 /* Commanded Power Sub-TLVs */
226 #define RNGRSP_COMMANDED_POWER_DYNAMIC_RANGE_WINDOW 1
227 #define RNGRSP_COMMANDED_POWER_UCID_AND_POWER_LEVEL_LIST 2
228 
229 
230 
231 /* BPKM Attributes defined in:
232  * http://www.cablemodem.com/downloads/specs/SP-BPI+_I10-030730.pdf
233  */
234 #define BPKM_RESERVED 0
235 #define BPKM_SERIAL_NUM 1
236 #define BPKM_MANUFACTURER_ID 2
237 #define BPKM_MAC_ADDR 3
238 #define BPKM_RSA_PUB_KEY 4
239 #define BPKM_CM_ID 5
240 #define BPKM_DISPLAY_STR 6
241 #define BPKM_AUTH_KEY 7
242 #define BPKM_TEK 8
243 #define BPKM_KEY_LIFETIME 9
244 #define BPKM_KEY_SEQ_NUM 10
245 #define BPKM_HMAC_DIGEST 11
246 #define BPKM_SAID 12
247 #define BPKM_TEK_PARAM 13
248 #define BPKM_OBSOLETED 14
249 #define BPKM_CBC_IV 15
250 #define BPKM_ERROR_CODE 16
251 #define BPKM_CA_CERT 17
252 #define BPKM_CM_CERT 18
253 #define BPKM_SEC_CAPABILITIES 19
254 #define BPKM_CRYPTO_SUITE 20
255 #define BPKM_CRYPTO_SUITE_LIST 21
256 #define BPKM_BPI_VERSION 22
257 #define BPKM_SA_DESCRIPTOR 23
258 #define BPKM_SA_TYPE 24
259 #define BPKM_SA_QUERY 25
260 #define BPKM_SA_QUERY_TYPE 26
261 #define BPKM_IP_ADDRESS 27
262 #define BPKM_DNLD_PARAMS 28
263 #define BPKM_VENDOR_DEFINED 127
264 
265 #define DCCREQ_UP_CHAN_ID 1
266 #define DCCREQ_DS_PARAMS 2
267 #define DCCREQ_INIT_TECH 3
268 #define DCCREQ_UCD_SUB 4
269 #define DCCREQ_SAID_SUB 6
270 #define DCCREQ_SF_SUB 7
271 #define DCCREQ_CMTS_MAC_ADDR 8
272 #define DCCREQ_KEY_SEQ_NUM 31
273 #define DCCREQ_HMAC_DIGEST 27
274 
275 /* Define Downstrean Parameters subtypes
276  * These are subtype of DCCREQ_DS_PARAMS (2)
277  */
278 
279 #define DCCREQ_DS_FREQ 1
280 #define DCCREQ_DS_MOD_TYPE 2
281 #define DCCREQ_DS_SYM_RATE 3
282 #define DCCREQ_DS_INTLV_DEPTH 4
283 #define DCCREQ_DS_CHAN_ID 5
284 #define DCCREQ_DS_SYNC_SUB 6
285 #define DCCREQ_DS_OFDM_BLOCK_FREQ 7
286 
287 /* Define Service Flow Substitution subtypes
288  * These are subtypes of DCCREQ_SF_SUB (7)
289  */
290 #define DCCREQ_SF_SFID 1
291 #define DCCREQ_SF_SID 2
292 #define DCCREQ_SF_UNSOL_GRANT_TREF 5
293 
294 #define DCCRSP_CM_JUMP_TIME 1
295 #define DCCRSP_KEY_SEQ_NUM 31
296 #define DCCRSP_HMAC_DIGEST 27
297 
298 /* Define DCC-RSP CM Jump Time subtypes
299  * These are subtype of DCCRSP_CM_JUMP_TIME (1)
300  */
301 #define DCCRSP_CM_JUMP_TIME_LENGTH 1
302 #define DCCRSP_CM_JUMP_TIME_START 2
303 
304 #define DCCACK_KEY_SEQ_NUM 31
305 #define DCCACK_HMAC_DIGEST 27
306 
307 #define DCD_DOWN_CLASSIFIER 23
308 #define DCD_DSG_RULE 50
309 #define DCD_DSG_CONFIG 51
310 
311 /* Define Downstrean Classifier subtypes
312  * These are subtype of DCD_DOWN_CLASSIFIER (23)
313  */
314 
315 #define DCD_CFR_ID 2
316 #define DCD_CFR_RULE_PRI 5
317 #define DCD_CFR_IP_CLASSIFIER 9
318 
319 /* Define IP Classifier sub-subtypes
320  * These are subtypes of DCD_CFR_IP_CLASSIFIER (23.9)
321  */
322 #define DCD_CFR_IP_SOURCE_ADDR 3
323 #define DCD_CFR_IP_SOURCE_MASK 4
324 #define DCD_CFR_IP_DEST_ADDR 5
325 #define DCD_CFR_IP_DEST_MASK 6
326 #define DCD_CFR_TCPUDP_SRCPORT_START 7
327 #define DCD_CFR_TCPUDP_SRCPORT_END 8
328 #define DCD_CFR_TCPUDP_DSTPORT_START 9
329 #define DCD_CFR_TCPUDP_DSTPORT_END 10
330 
331 /* Define DSG Rule subtypes
332  * These are subtype of DCD_DSG_RULE (50)
333  */
334 
335 #define DCD_RULE_ID 1
336 #define DCD_RULE_PRI 2
337 #define DCD_RULE_UCID_RNG 3
338 #define DCD_RULE_CLIENT_ID 4
339 #define DCD_RULE_TUNL_ADDR 5
340 #define DCD_RULE_CFR_ID 6
341 #define DCD_RULE_VENDOR_SPEC 43
342 /* Define DSG Rule Client ID sub-subtypes
343  * These are subtypes of DCD_RULE_CLIENT_ID (50.4)
344  */
345 #define DCD_CLID_BCAST_ID 1
346 #define DCD_CLID_KNOWN_MAC_ADDR 2
347 #define DCD_CLID_CA_SYS_ID 3
348 #define DCD_CLID_APP_ID 4
349 
350 /* Define DSG Configuration subtypes
351  * These are subtype of DCD_DSG_CONFIG (51)
352  */
353 
354 #define DCD_CFG_CHAN_LST 1
355 #define DCD_CFG_TDSG1 2
356 #define DCD_CFG_TDSG2 3
357 #define DCD_CFG_TDSG3 4
358 #define DCD_CFG_TDSG4 5
359 #define DCD_CFG_VENDOR_SPEC 43
360 
361 /* EM TLVs
362  *
363  */
364 #define EM_HOLDOFF_TIMER 1
365 
366 #define DOWNSTREAM_ACTIVE_CHANNEL_LIST 1
367 #define MAC_DOMAIN_DOWNSTREAM_SERVICE_GROUP 2
368 #define DOWNSTREAM_AMBIGUITY_RESOLUTION_FREQUENCY_LIST 3
369 #define RECEIVE_CHANNEL_PROFILE_REPORTING_CONTROL 4
370 #define IP_INITIALIZATION_PARAMETERS 5
371 #define EARLY_AUTHENTICATION_AND_ENCRYPTION 6
372 #define UPSTREAM_ACTIVE_CHANNEL_LIST 7
373 #define UPSTREAM_AMBIGUITY_RESOLUTION_CHANNEL_LIST 8
374 #define UPSTREAM_FREQUENCY_RANGE 9
375 #define SYMBOL_CLOCK_LOCKING_INDICATOR 10
376 #define CM_STATUS_EVENT_CONTROL 11
377 #define UPSTREAM_TRANSMIT_POWER_REPORTING 12
378 #define DSG_DA_TO_DSID_ASSOCIATION_ENTRY 13
379 #define CM_STATUS_EVENT_ENABLE_NON_CHANNEL_SPECIFIC_EVENTS 15
380 #define EXTENDED_UPSTREAM_TRANSMIT_POWER_SUPPORT 16
381 #define CMTS_DOCSIS_VERSION 17
382 #define CM_PERIODIC_MAINTENANCE_TIMEOUT_INDICATOR 18
383 #define DLS_BROADCAST_AND_MULTICAST_DELIVERY_METHOD 19
384 #define CM_STATUS_EVENT_ENABLE_FOR_DOCSIS_3_1_EVENTS 20
385 #define DIPLEXER_BAND_EDGE 21
386 #define FULL_DUPLEX_DESCRIPTOR 22
387 
388 
389 /* Downstream Active Channel List */
390 #define DOWNSTREAM_ACTIVE_CHANNEL_LIST_CHANNEL_ID 1
391 #define DOWNSTREAM_ACTIVE_CHANNEL_LIST_FREQUENCY 2
392 #define DOWNSTREAM_ACTIVE_CHANNEL_LIST_MODULATION_ORDER_ANNEX 3
393 #define DOWNSTREAM_ACTIVE_CHANNEL_LIST_PRIMARY_CAPABLE 4
394 #define DOWNSTREAM_ACTIVE_CHANNEL_LIST_CM_STATUS_EVENT_ENABLE_BITMASK 5
395 #define DOWNSTREAM_ACTIVE_CHANNEL_LIST_MAP_UCD_TRANSPORT_INDICATOR 6
396 #define DOWNSTREAM_ACTIVE_CHANNEL_LIST_OFDM_PLC_PARAMETERS 7
397 #define DOWNSTREAM_ACTIVE_CHANNEL_LIST_FDX_SUB_BAND_ID 8
398 
399 /* MAC Domain Downstream Service Group */
400 #define MAC_DOMAIN_DOWNSTREAM_SERVICE_GROUP_MD_DS_SG_IDENTIFIER 1
401 #define MAC_DOMAIN_DOWNSTREAM_SERVICE_GROUP_CHANNEL_IDS 2
402 
403 /* Modulation Orders */
404 #define QAM64 0
405 #define QAM256 1
406 
407 /* Annexes */
408 #define J83_ANNEX_A 0
409 #define J83_ANNEX_B 1
410 #define J83_ANNEX_C 2
411 
412 /* Primary Capable */
413 #define NOT_PRIMARY_CAPABLE 0
414 #define PRIMARY_CAPABLE 1
415 #define FDX_DOWNSTREAM_CHANNEL 2
416 
417 /* Can carry MAP and UCD */
418 #define CANNOT_CARRY_MAP_UCD 0
419 #define CAN_CARRY_MAP_UCD 1
420 
421 /* Receive Channel Profile Reporting Control */
422 #define RCP_CENTER_FREQUENCY_SPACING 1
423 #define VERBOSE_RCP_REPORTING 2
424 #define FRAGMENTED_RCP_TRANSMISSION 3
425 
426 /* Frequency spacing */
427 #define ASSUME_6MHZ_CENTER_FREQUENCY_SPACING 0
428 #define ASSUME_8MHZ_CENTER_FREQUENCY_SPACING 1
429 
430 /* Verbose RCP reporting */
431 #define RCP_NO_VERBOSE_REPORTING 0
432 #define RCP_VERBOSE_REPORTING 1
433 
434 /* Sub-TLVs for IP Initialization Parameters */
435 #define IP_PROVISIONING_MODE 1
436 #define PRE_REGISTRATION_DSID 2
437 
438 /* IP Provisioning Modes */
439 #define IPv4_ONLY 0
440 #define IPv6_ONLY 1
441 #define IP_ALTERNATE 2
442 #define DUAL_STACK 3
443 
444 /* Early authentication and encryption */
445 #define EAE_DISABLED 0
446 #define EAE_ENABLED 1
447 
448 /* Upstream Active Channel List */
449 #define UPSTREAM_ACTIVE_CHANNEL_LIST_UPSTREAM_CHANNEL_ID 1
450 #define UPSTREAM_ACTIVE_CHANNEL_LIST_CM_STATUS_EVENT_ENABLE_BITMASK 2
451 #define UPSTREAM_ACTIVE_CHANNEL_LIST_UPSTREAM_CHANNEL_PRIORITY 3
452 #define UPSTREAM_ACTIVE_CHANNEL_LIST_DSCHIDS_MAPS_UCDS 4
453 #define UPSTREAM_ACTIVE_CHANNEL_LIST_FDX_UPSTREAM_CHANNEL 5
454 #define UPSTREAM_ACTIVE_CHANNEL_LIST_FDX_SUBBAND_ID 6
455 
456 /* Upstream Frequency Range */
457 #define STANDARD_UPSTREAM_FREQUENCY_RANGE 0
458 #define EXTENDED_UPSTREAM_FREQUENCY_RANGE 1
459 
460 /* Symbol Clock Locking Indicator */
461 #define NOT_LOCKED_TO_MASTER_CLOCK 0
462 #define LOCKED_TO_MASTER_CLOCK 1
463 
464 /* CM-STATUS Event Control */
465 #define EVENT_TYPE_CODE 1
466 #define MAXIMUM_EVENT_HOLDOFF_TIMER 2
467 #define MAXIMUM_NUMBER_OF_REPORTS_PER_EVENT 3
468 
469 /* CM-STATUS Events */
470 #define SECONDARY_CHANNEL_MDD_TIMEOUT 1
471 #define QAM_FEC_LOCK_FAILURE 2
472 #define SEQUENCE_OUT_OF_RANGE 3
473 #define MDD_RECOVERY 4
474 #define QAM_FEC_LOCK_RECOVERY 5
475 #define T4_TIMEOUT 6
476 #define T3_RETRIES_EXCEEDED 7
477 #define SUCCESFUL_RANGING_AFTER_T3_RETRIES_EXCEEDED 8
478 #define CM_OPERATING_ON_BATTERY_BACKUP 9
479 #define CM_RETURNED_TO_AC_POWER 10
480 
481 /* Upstream Transmit Power Reporting */
482 #define CM_DOESNT_REPORT_TRANSMIT_POWER 0
483 #define CM_REPORTS_TRANSMIT_POWER 1
484 
485 /* DSG DA to DSID association entry */
486 #define DSG_DA_TO_DSID_ASSOCIATION_DA 1
487 #define DSG_DA_TO_DSID_ASSOCIATION_DSID 2
488 
489 /* CMTS DOCSIS VERSION */
490 #define CMTS_MAJOR_DOCSIS_VERSION 1
491 #define CMTS_MINOR_DOCSIS_VERSION 2
492 
493 /* Define Tukey raised cosine window */
494 #define TUKEY_0TS 0
495 #define TUKEY_64TS 1
496 #define TUKEY_128TS 2
497 #define TUKEY_192TS 3
498 #define TUKEY_256TS 4
499 
500 /* Define Cyclic prefix */
501 #define CYCLIC_PREFIX_192_TS 0
502 #define CYCLIC_PREFIX_256_TS 1
503 #define CYCLIC_PREFIX_512_TS 2
504 #define CYCLIC_PREFIX_768_TS 3
505 #define CYCLIC_PREFIX_1024_TS 4
506 
507 /* Define Sub carrier spacing */
508 #define SPACING_25KHZ 0
509 #define SPACING_50KHZ 1
510 
511 #define SEC_CH_MDD_TIMEOUT 1
512 #define QAM_FEC_LOCK_FAILURE 2
513 #define SEQ_OUT_OF_RANGE 3
514 #define SEC_CH_MDD_RECOVERY 4
515 #define QAM_FEC_LOCK_RECOVERY 5
516 #define T4_TIMEOUT 6
517 #define T3_RETRIES_EXCEEDED 7
518 #define SUCCESS_RANGING_AFTER_T3_RETRIES_EXCEEDED 8
519 #define CM_ON_BATTERY 9
520 #define CM_ON_AC_POWER 10
521 #define MAC_REMOVAL_EVENT 11
522 #define DS_OFDM_PROFILE_FAILURE 16
523 #define PRIMARY_DOWNSTREAM_CHANGE 17
524 #define DPD_MISMATCH 18
525 #define NCP_PROFILE_FAILURE 20
526 #define PLC_FAILURE 21
527 #define NCP_PROFILE_RECOVERY 22
528 #define PLC_RECOVERY 23
529 #define OFDM_PROFILE_RECOVERY 24
530 #define OFDMA_PROFILE_FAILURE 25
531 #define MAP_STORAGE_OVERFLOW_INDICATOR 26
532 #define MAP_STORAGE_ALMOST_FULL_INDICATOR 27
533 
534 #define STATUS_EVENT 1
535 
536 #define EVENT_DESCR 2
537 #define EVENT_DS_CH_ID 4
538 #define EVENT_US_CH_ID 5
539 #define EVENT_DSID 6
540 #define EVENT_MAC_ADDRESS 7
541 #define EVENT_DS_OFDM_PROFILE_ID 8
542 #define EVENT_US_OFDMA_PROFILE_ID 9
543 
544 #define CM_CTRL_MUTE 1
545 #define CM_CTRL_MUTE_TIMEOUT 2
546 #define CM_CTRL_REINIT 3
547 #define CM_CTRL_DISABLE_FWD 4
548 #define CM_CTRL_DS_EVENT 5
549 #define CM_CTRL_US_EVENT 6
550 #define CM_CTRL_EVENT 7
551 
552 #define DS_EVENT_CH_ID 1
553 #define DS_EVENT_MASK 2
554 
555 #define US_EVENT_CH_ID 1
556 #define US_EVENT_MASK 2
557 
558 #define DISCRETE_FOURIER_TRANSFORM_SIZE 0
559 #define CYCLIC_PREFIX 1
560 #define ROLL_OFF 2
561 #define OFDM_SPECTRUM_LOCATION 3
562 #define TIME_INTERLEAVING_DEPTH 4
563 #define SUBCARRIER_ASSIGNMENT_RANGE_LIST 5
564 #define PRIMARY_CAPABILITY_INDICATOR 6
565 #define SUBCARRIER_ASSIGNMENT_VECTOR 6
566 
567 #define SUBCARRIER_ASSIGNMENT_RANGE_CONT 0
568 #define SUBCARRIER_ASSIGNMENT_RANGE_SKIPBY1 1
569 #define SUBCARRIER_ASSIGNMENT_LIST 2
570 
571 #define OPT_REQ_REQ_STAT 1
572 #define OPT_REQ_RXMER_THRESH_PARAMS 2
573 #define OPT_REQ_RXMER_THRESH_PARAMS_MODULATION_ORDER 1
574 
575 #define OPT_RSP_RXMER_AND_SNR_MARGIN_DATA 1
576 #define OPT_RSP_RXMER_PER_SUBCARRIER 1
577 #define OPT_RSP_SNR_MARGIN 4
578 
579 #define DIPLEXER_US_UPPER_BAND_EDGE 1
580 #define DIPLEXER_DS_LOWER_BAND_EDGE 2
581 #define DIPLEXER_DS_UPPER_BAND_EDGE 3
582 
583 #define FDX_ALLOCATED_SPECTRUM 1
584 #define FDX_TOTAL_NUMBER_OF_SUB_BANDS 2
585 #define FDX_SUB_BAND_WIDTH 3
586 #define FDX_SUB_BAND_DESCRIPTOR 4
587 
588 #define FDX_SUB_BAND_ID 1
589 #define FDX_SUB_BAND_OFFSET 2
590 
591 #define KEY_MGMT_VERSION 0
592 #define KEY_MGMT_MULTIPART 1
593 
594 static int proto_docsis_mgmt = -1;
595 static int proto_docsis_sync = -1;
596 static int proto_docsis_ucd = -1;
597 static int proto_docsis_map_v1 = -1;
598 static int proto_docsis_map_v5 = -1;
599 static int proto_docsis_rngreq = -1;
600 static int proto_docsis_rngrsp = -1;
601 static int proto_docsis_regreq = -1;
602 static int proto_docsis_regrsp = -1;
603 static int proto_docsis_uccreq = -1;
604 static int proto_docsis_uccrsp = -1;
605 static int proto_docsis_bpkmreq = -1;
606 static int proto_docsis_bpkmrsp = -1;
607 static int proto_docsis_regack = -1;
608 static int proto_docsis_dsareq = -1;
609 static int proto_docsis_dsarsp = -1;
610 static int proto_docsis_dsaack = -1;
611 static int proto_docsis_dscreq = -1;
612 static int proto_docsis_dscrsp = -1;
613 static int proto_docsis_dscack = -1;
614 static int proto_docsis_dsdreq = -1;
615 static int proto_docsis_dsdrsp = -1;
616 static int proto_docsis_dccreq = -1;
617 static int proto_docsis_dccrsp = -1;
618 static int proto_docsis_dccack = -1;
619 static int proto_docsis_type29ucd = -1;
620 static int proto_docsis_intrngreq = -1;
621 static int proto_docsis_dcd = -1;
622 static int proto_docsis_mdd = -1;
623 static int proto_docsis_bintrngreq = -1;
624 static int proto_docsis_type35ucd = -1;
625 static int proto_docsis_dbcreq = -1;
626 static int proto_docsis_dbcrsp = -1;
627 static int proto_docsis_dbcack = -1;
628 static int proto_docsis_dpvreq = -1;
629 static int proto_docsis_dpvrsp = -1;
630 static int proto_docsis_cmstatus = -1;
631 static int proto_docsis_cmstatusack = -1;
632 static int proto_docsis_cmctrlreq = -1;
633 static int proto_docsis_cmctrlrsp = -1;
634 static int proto_docsis_regreqmp = -1;
635 static int proto_docsis_regrspmp = -1;
636 static int proto_docsis_emreq = -1;
637 static int proto_docsis_emrsp = -1;
638 static int proto_docsis_ocd = -1;
639 static int proto_docsis_dpd = -1;
640 static int proto_docsis_type51ucd = -1;
641 static int proto_docsis_optreq = -1;
642 static int proto_docsis_optrsp = -1;
643 static int proto_docsis_optack = -1;
644 static int proto_docsis_rba = -1;
645 
646 static int hf_docsis_sync_cmts_timestamp = -1;
647 
648 static int hf_docsis_ucd_config_ch_cnt = -1;
649 static int hf_docsis_ucd_mini_slot_size = -1;
650 static int hf_docsis_ucd_type = -1;
651 static int hf_docsis_ucd_length = -1;
652 static int hf_docsis_ucd_burst_type = -1;
653 static int hf_docsis_ucd_burst_length = -1;
654 static int hf_docsis_ucd_symbol_rate = -1;
655 static int hf_docsis_ucd_frequency = -1;
656 static int hf_docsis_ucd_preamble_pat = -1;
657 static int hf_docsis_ucd_ext_preamble_pat = -1;
658 static int hf_docsis_ucd_scdma_mode_enabled = -1;
659 static int hf_docsis_ucd_scdma_spreading_interval = -1;
660 static int hf_docsis_ucd_scdma_codes_per_mini_slot = -1;
661 static int hf_docsis_ucd_scdma_active_codes = -1;
662 static int hf_docsis_ucd_scdma_code_hopping_seed = -1;
663 static int hf_docsis_ucd_scdma_us_ratio_num = -1;
664 static int hf_docsis_ucd_scdma_us_ratio_denom = -1;
665 static int hf_docsis_ucd_scdma_timestamp_snapshot = -1;
666 static int hf_docsis_ucd_maintain_power_spectral_density = -1;
667 static int hf_docsis_ucd_ranging_required = -1;
668 static int hf_docsis_ucd_max_scheduled_codes = -1;
669 static int hf_docsis_ucd_rnghoff_cm = -1;
670 static int hf_docsis_ucd_rnghoff_erouter = -1;
671 static int hf_docsis_ucd_rnghoff_emta = -1;
672 static int hf_docsis_ucd_rnghoff_estb = -1;
673 static int hf_docsis_ucd_rnghoff_rsvd = -1;
674 static int hf_docsis_ucd_rnghoff_id_ext = -1;
675 static int hf_docsis_ucd_chan_class_id_cm = -1;
676 static int hf_docsis_ucd_chan_class_id_erouter = -1;
677 static int hf_docsis_ucd_chan_class_id_emta = -1;
678 static int hf_docsis_ucd_chan_class_id_estb = -1;
679 static int hf_docsis_ucd_chan_class_id_rsvd = -1;
680 static int hf_docsis_ucd_chan_class_id_id_ext = -1;
681 static int hf_docsis_ucd_scdma_scrambler_onoff = -1;
682 static int hf_docsis_ucd_scdma_codes_per_subframe = -1;
683 static int hf_docsis_ucd_scdma_framer_int_step_size = -1;
684 static int hf_docsis_ucd_tcm_enabled = -1;
685 static int hf_docsis_ucd_active_code_hopping = -1;
686 static int hf_docsis_ucd_higher_ucd_for_same_ucid = -1;
687 static int hf_docsis_ucd_higher_ucd_for_same_ucid_resv = -1;
688 static int hf_docsis_ucd_scdma_selection_active_codes = -1;
689 static int hf_docsis_ucd_iuc = -1;
690 static int hf_docsis_ucd_change_ind_bitmask_subc_excl_band = -1;
691 static int hf_docsis_ucd_change_ind_bitmask_unused_subc = -1;
692 static int hf_docsis_ucd_change_ind_bitmask_other_subc = -1;
693 static int hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc5 = -1;
694 static int hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc6 = -1;
695 static int hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc9 = -1;
696 static int hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc10 = -1;
697 static int hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc11 = -1;
698 static int hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc12 = -1;
699 static int hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc13 = -1;
700 static int hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc3_or_4 = -1;
701 static int hf_docsis_ucd_change_ind_bitmask_reserved = -1;
702 static int hf_docsis_ucd_ofdma_timestamp_snapshot = -1;
703 static int hf_docsis_ucd_ofdma_timestamp_snapshot_reserved = -1;
704 static int hf_docsis_ucd_ofdma_timestamp_snapshot_d30timestamp = -1;
705 static int hf_docsis_ucd_ofdma_timestamp_snapshot_4msbits_of_div20 = -1;
706 static int hf_docsis_ucd_ofdma_timestamp_snapshot_minislot_count = -1;
707 static int hf_docsis_ucd_ofdma_cyclic_prefix_size = -1;
708 static int hf_docsis_ucd_ofdma_rolloff_period_size = -1;
709 static int hf_docsis_ucd_subc_spacing = -1;
710 static int hf_docsis_ucd_cent_freq_subc0 = -1;
711 static int hf_docsis_ucd_subcarrier_range = -1;
712 static int hf_docsis_ucd_symb_ofdma_frame = -1;
713 static int hf_docsis_ucd_rand_seed = -1;
714 
715 static int hf_docsis_burst_mod_type = -1;
716 static int hf_docsis_burst_diff_encoding = -1;
717 static int hf_docsis_burst_preamble_len = -1;
718 static int hf_docsis_burst_preamble_val_off = -1;
719 static int hf_docsis_burst_fec = -1;
720 static int hf_docsis_burst_fec_codeword = -1;
721 static int hf_docsis_burst_scrambler_seed = -1;
722 static int hf_docsis_burst_max_burst = -1;
723 static int hf_docsis_burst_guard_time = -1;
724 static int hf_docsis_burst_last_cw_len = -1;
725 static int hf_docsis_burst_scrambler_onoff = -1;
726 static int hf_docsis_rs_int_depth = -1;
727 static int hf_docsis_rs_int_block = -1;
728 static int hf_docsis_preamble_type = -1;
729 static int hf_docsis_subc_init_rang = -1;
730 static int hf_docsis_subc_fine_rang = -1;
731 static int hf_docsis_ofdma_prof_mod_order = -1;
732 static int hf_docsis_ofdma_prof_pilot_pattern = -1;
733 static int hf_docsis_ofdma_prof_num_add_minislots = -1;
734 static int hf_docsis_ofdma_ir_pow_ctrl_start_pow = -1;
735 static int hf_docsis_ofdma_ir_pow_ctrl_step_size = -1;
736 
737 static int hf_docsis_map_ucd_count = -1;
738 static int hf_docsis_map_numie = -1;
739 static int hf_docsis_map_numie_v5 = -1;
740 static int hf_docsis_map_alloc_start = -1;
741 static int hf_docsis_map_ack_time = -1;
742 static int hf_docsis_map_rng_start = -1;
743 static int hf_docsis_map_rng_end = -1;
744 static int hf_docsis_map_data_start = -1;
745 static int hf_docsis_map_data_end = -1;
746 static int hf_docsis_map_ie = -1;
747 static int hf_docsis_map_probe_ie = -1;
748 
749 static int hf_docsis_map_rsvd = -1;
750 static int hf_docsis_map_rsvd_v5 = -1;
751 static int hf_docsis_map_cat = -1;
752 
753 static int hf_docsis_map_sid = -1;
754 static int hf_docsis_map_iuc = -1;
755 static int hf_docsis_map_offset = -1;
756 static int hf_docsis_map_mer = -1;
757 static int hf_docsis_map_pw = -1;
758 static int hf_docsis_map_eq = -1;
759 static int hf_docsis_map_st = -1;
760 static int hf_docsis_map_probe_frame = -1;
761 static int hf_docsis_map_symbol_in_frame = -1;
762 static int hf_docsis_map_start_subc = -1;
763 static int hf_docsis_map_subc_skip = -1;
764 
765 
766 static int hf_docsis_rngreq_sid_field_bit15 = -1;
767 static int hf_docsis_rngreq_sid_field_bit14 = -1;
768 static int hf_docsis_rngreq_sid_field_bit15_14 = -1;
769 static int hf_docsis_rngreq_sid = -1;
770 static int hf_docsis_rngreq_pend_compl = -1;
771 
772 static int hf_docsis_rngrsp_type = -1;
773 static int hf_docsis_rngrsp_length = -1;
774 static int hf_docsis_rngrsp_sid = -1;
775 static int hf_docsis_rngrsp_timing_adj = -1;
776 static int hf_docsis_rngrsp_power_adj = -1;
777 static int hf_docsis_rngrsp_freq_adj = -1;
778 static int hf_docsis_rngrsp_xmit_eq_adj = -1;
779 static int hf_docsis_rngrsp_ranging_status = -1;
780 static int hf_docsis_rngrsp_down_freq_over = -1;
781 static int hf_docsis_rngrsp_upstream_ch_over = -1;
782 static int hf_docsis_rngrsp_xmit_eq_set = -1;
783 static int hf_docsis_rngrsp_rngrsp_t4_timeout_multiplier = -1;
784 static int hf_docsis_rngrsp_dynamic_range_window_upper_edge = -1;
785 static int hf_docsis_rngrsp_tlv_unknown = -1;
786 static int hf_docsis_rngrsp_trans_eq_data = -1;
787 static int hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_main_tap_location = -1;
788 static int hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_number_of_forward_taps_per_symbol = -1;
789 static int hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_number_of_forward_taps_n = -1;
790 static int hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_reserved = -1;
791 static int hf_docsis_rngrsp_trans_eq_enc_lowest_subc = -1;
792 static int hf_docsis_rngrsp_trans_eq_enc_highest_subc = -1;
793 static int hf_docsis_rngrsp_trans_eq_enc_coef_real = -1;
794 static int hf_docsis_rngrsp_trans_eq_enc_coef_imag = -1;
795 static int hf_docsis_rngrsp_commanded_power_data = -1;
796 static int hf_docsis_rngrsp_commanded_power_dynamic_range_window = -1;
797 static int hf_docsis_rngrsp_commanded_power_ucid = -1;
798 static int hf_docsis_rngrsp_commanded_power_trans_pow_lvl = -1;
799 
800 
801 static int hf_docsis_regreq_sid = -1;
802 static int hf_docsis_regrsp_sid = -1;
803 static int hf_docsis_regrsp_response = -1;
804 
805 static int hf_docsis_bpkm_code = -1;
806 static int hf_docsis_bpkm_length = -1;
807 static int hf_docsis_bpkm_ident = -1;
808 static int hf_docsis_bpkmattr = -1;
809 static int hf_docsis_bpkmattr_serial_num = -1;
810 static int hf_docsis_bpkmattr_manf_id = -1;
811 static int hf_docsis_bpkmattr_mac_addr = -1;
812 static int hf_docsis_bpkmattr_rsa_pub_key = -1;
813 static int hf_docsis_bpkmattr_cm_id = -1;
814 static int hf_docsis_bpkmattr_display_str = -1;
815 static int hf_docsis_bpkmattr_auth_key = -1;
816 static int hf_docsis_bpkmattr_tek = -1;
817 static int hf_docsis_bpkmattr_key_life = -1;
818 static int hf_docsis_bpkmattr_key_seq = -1;
819 static int hf_docsis_bpkmattr_hmac_digest = -1;
820 static int hf_docsis_bpkmattr_said = -1;
821 static int hf_docsis_bpkmattr_tek_params = -1;
822 static int hf_docsis_bpkmattr_cbc_iv = -1;
823 static int hf_docsis_bpkmattr_error_code = -1;
824 static int hf_docsis_bpkmattr_vendor_def = -1;
825 static int hf_docsis_bpkmattr_ca_cert = -1;
826 static int hf_docsis_bpkmattr_cm_cert = -1;
827 static int hf_docsis_bpkmattr_security_cap = -1;
828 static int hf_docsis_bpkmattr_crypto_suite = -1;
829 static int hf_docsis_bpkmattr_crypto_suite_list = -1;
830 static int hf_docsis_bpkmattr_bpi_version = -1;
831 static int hf_docsis_bpkmattr_sa_descr = -1;
832 static int hf_docsis_bpkmattr_sa_type = -1;
833 static int hf_docsis_bpkmattr_sa_query = -1;
834 static int hf_docsis_bpkmattr_sa_query_type = -1;
835 static int hf_docsis_bpkmattr_ip_address = -1;
836 static int hf_docsis_bpkmattr_download_param = -1;
837 static int hf_docsis_bpkmattr_type = -1;
838 static int hf_docsis_bpkmattr_length = -1;
839 
840 static int hf_docsis_regack_sid = -1;
841 static int hf_docsis_regack_response = -1;
842 
843 static int hf_docsis_dsarsp_response = -1;
844 static int hf_docsis_dsaack_response = -1;
845 
846 static int hf_docsis_dscrsp_response = -1;
847 static int hf_docsis_dscack_response = -1;
848 
849 static int hf_docsis_dsdreq_rsvd = -1;
850 static int hf_docsis_dsdreq_sfid = -1;
851 
852 static int hf_docsis_dsdrsp_confcode = -1;
853 static int hf_docsis_dsdrsp_rsvd = -1;
854 
855 static int hf_docsis_dccreq_type = -1;
856 static int hf_docsis_dccreq_length = -1;
857 static int hf_docsis_dccreq_tran_id = -1;
858 static int hf_docsis_dccreq_up_chan_id = -1;
859 static int hf_docsis_dcc_ds_params_subtype = -1;
860 static int hf_docsis_dcc_ds_params_length = -1;
861 static int hf_docsis_dccreq_ds_freq = -1;
862 static int hf_docsis_dccreq_ds_mod_type = -1;
863 static int hf_docsis_dccreq_ds_sym_rate = -1;
864 static int hf_docsis_dccreq_ds_intlv_depth_i = -1;
865 static int hf_docsis_dccreq_ds_intlv_depth_j = -1;
866 static int hf_docsis_dccreq_ds_chan_id = -1;
867 static int hf_docsis_dccreq_ds_sync_sub = -1;
868 static int hf_docsis_dccreq_ds_ofdm_block_freq = -1;
869 static int hf_docsis_dccreq_init_tech = -1;
870 static int hf_docsis_dccreq_ucd_sub = -1;
871 static int hf_docsis_dccreq_said_sub_cur = -1;
872 static int hf_docsis_dccreq_said_sub_new = -1;
873 static int hf_docsis_dcc_sf_sub_subtype = -1;
874 static int hf_docsis_dcc_sf_sub_length = -1;
875 static int hf_docsis_dccreq_sf_sfid_cur = -1;
876 static int hf_docsis_dccreq_sf_sfid_new = -1;
877 static int hf_docsis_dccreq_sf_sid_cur = -1;
878 static int hf_docsis_dccreq_sf_sid_new = -1;
879 static int hf_docsis_dccreq_sf_unsol_grant_tref = -1;
880 static int hf_docsis_dccreq_cmts_mac_addr = -1;
881 static int hf_docsis_dccreq_key_seq_num = -1;
882 static int hf_docsis_dccreq_hmac_digest = -1;
883 static int hf_docsis_dccrsp_conf_code = -1;
884 static int hf_docsis_dccrsp_type = -1;
885 static int hf_docsis_dccrsp_length = -1;
886 static int hf_docsis_dcc_cm_jump_subtype = -1;
887 static int hf_docsis_dcc_cm_jump_length = -1;
888 static int hf_docsis_dccrsp_cm_jump_time_length = -1;
889 static int hf_docsis_dccrsp_cm_jump_time_start = -1;
890 static int hf_docsis_dccrsp_key_seq_num = -1;
891 static int hf_docsis_dccrsp_hmac_digest = -1;
892 static int hf_docsis_dccack_type = -1;
893 static int hf_docsis_dccack_length = -1;
894 static int hf_docsis_dccack_key_seq_num = -1;
895 static int hf_docsis_dccack_hmac_digest = -1;
896 
897 static int hf_docsis_intrngreq_sid = -1;
898 
899 static int hf_docsis_dcd_config_ch_cnt = -1;
900 static int hf_docsis_dcd_num_of_frag = -1;
901 static int hf_docsis_dcd_frag_sequence_num = -1;
902 static int hf_docsis_dcd_type = -1;
903 static int hf_docsis_dcd_length = -1;
904 static int hf_docsis_dcd_down_classifier_subtype = -1;
905 static int hf_docsis_dcd_down_classifier_length = -1;
906 static int hf_docsis_dcd_cfr_id = -1;
907 static int hf_docsis_dcd_cfr_rule_pri = -1;
908 static int hf_docsis_dcd_cfr_ip_subtype = -1;
909 static int hf_docsis_dcd_cfr_ip_length = -1;
910 static int hf_docsis_dcd_cfr_ip_source_addr = -1;
911 static int hf_docsis_dcd_cfr_ip_source_mask = -1;
912 static int hf_docsis_dcd_cfr_ip_dest_addr = -1;
913 static int hf_docsis_dcd_cfr_ip_dest_mask = -1;
914 static int hf_docsis_dcd_cfr_tcpudp_srcport_start = -1;
915 static int hf_docsis_dcd_cfr_tcpudp_srcport_end = -1;
916 static int hf_docsis_dcd_cfr_tcpudp_dstport_start = -1;
917 static int hf_docsis_dcd_cfr_tcpudp_dstport_end = -1;
918 static int hf_docsis_dcd_rule_id = -1;
919 static int hf_docsis_dcd_rule_pri = -1;
920 static int hf_docsis_dcd_rule_ucid_list = -1;
921 static int hf_docsis_dcd_clid_subtype = -1;
922 static int hf_docsis_dcd_clid_length = -1;
923 static int hf_docsis_dcd_clid_bcast_id = -1;
924 static int hf_docsis_dcd_clid_known_mac_addr = -1;
925 static int hf_docsis_dcd_clid_ca_sys_id = -1;
926 static int hf_docsis_dcd_clid_app_id = -1;
927 static int hf_docsis_dcd_dsg_rule_subtype = -1;
928 static int hf_docsis_dcd_dsg_rule_length = -1;
929 static int hf_docsis_dcd_rule_tunl_addr = -1;
930 static int hf_docsis_dcd_rule_cfr_id = -1;
931 static int hf_docsis_dcd_rule_vendor_spec = -1;
932 static int hf_docsis_dcd_cfg_subtype = -1;
933 static int hf_docsis_dcd_cfg_length = -1;
934 static int hf_docsis_dcd_cfg_chan = -1;
935 static int hf_docsis_dcd_cfg_tdsg1 = -1;
936 static int hf_docsis_dcd_cfg_tdsg2 = -1;
937 static int hf_docsis_dcd_cfg_tdsg3 = -1;
938 static int hf_docsis_dcd_cfg_tdsg4 = -1;
939 static int hf_docsis_dcd_cfg_vendor_spec = -1;
940 
941 static int hf_docsis_mdd_ccc = -1;
942 static int hf_docsis_mdd_number_of_fragments = -1;
943 static int hf_docsis_mdd_fragment_sequence_number = -1;
944 static int hf_docsis_mdd_current_channel_dcid = -1;
945 static int hf_docsis_mdd_ds_active_channel_list_subtype = -1;
946 static int hf_docsis_mdd_ds_active_channel_list_length = -1;
947 static int hf_docsis_mdd_downstream_active_channel_list_channel_id = -1;
948 static int hf_docsis_mdd_downstream_active_channel_list_frequency = -1;
949 static int hf_docsis_mdd_downstream_active_channel_list_annex = -1;
950 static int hf_docsis_mdd_downstream_active_channel_list_modulation_order = -1;
951 static int hf_docsis_mdd_downstream_active_channel_list_primary_capable = -1;
952 static int hf_docsis_mdd_downstream_active_channel_list_map_ucd_transport_indicator = -1;
953 static int hf_docsis_mdd_cm_status_event_enable_bitmask = -1;
954 static int hf_docsis_mdd_cm_status_event_enable_bitmask_mdd_timeout = -1;
955 static int hf_docsis_mdd_cm_status_event_enable_bitmask_qam_fec_lock_failure = -1;
956 static int hf_docsis_mdd_cm_status_event_enable_bitmask_mdd_recovery = -1;
957 static int hf_docsis_mdd_cm_status_event_enable_bitmask_qam_fec_lock_recovery = -1;
958 static int hf_docsis_mdd_ofdm_plc_parameters = -1;
959 static int hf_docsis_mdd_ofdm_plc_parameters_tukey_raised_cosine_window = -1;
960 static int hf_docsis_mdd_ofdm_plc_parameters_cyclic_prefix = -1;
961 static int hf_docsis_mdd_ofdm_plc_parameters_sub_carrier_spacing = -1;
962 static int hf_docsis_mdd_up_active_channel_list_subtype = -1;
963 static int hf_docsis_mdd_up_active_channel_list_length = -1;
964 static int hf_docsis_mdd_cm_status_event_enable_bitmask_t4_timeout = -1;
965 static int hf_docsis_mdd_cm_status_event_enable_bitmask_t3_retries_exceeded = -1;
966 static int hf_docsis_mdd_cm_status_event_enable_bitmask_successful_ranging_after_t3_retries_exceeded = -1;
967 static int hf_docsis_mdd_ds_service_group_subtype = -1;
968 static int hf_docsis_mdd_ds_service_group_length = -1;
969 static int hf_docsis_mdd_mac_domain_downstream_service_group_md_ds_sg_identifier = -1;
970 static int hf_docsis_mdd_mac_domain_downstream_service_group_channel_id = -1;
971 static int hf_docsis_mdd_type = -1;
972 static int hf_docsis_mdd_length = -1;
973 static int hf_docsis_mdd_downstream_ambiguity_resolution_frequency = -1;
974 static int hf_docsis_mdd_channel_profile_reporting_control_subtype = -1;
975 static int hf_docsis_mdd_channel_profile_reporting_control_length = -1;
976 static int hf_docsis_mdd_rcp_center_frequency_spacing = -1;
977 static int hf_docsis_mdd_verbose_rcp_reporting = -1;
978 static int hf_docsis_mdd_fragmented_rcp_transmission = -1;
979 static int hf_docsis_mdd_ip_init_param_subtype = -1;
980 static int hf_docsis_mdd_ip_init_param_length = -1;
981 static int hf_docsis_mdd_ip_provisioning_mode = -1;
982 static int hf_docsis_mdd_pre_registration_dsid = -1;
983 static int hf_docsis_mdd_early_authentication_and_encryption = -1;
984 static int hf_docsis_mdd_upstream_active_channel_list_upstream_channel_id = -1;
985 static int hf_docsis_mdd_upstream_active_channel_list_upstream_channel_priority = -1;
986 static int hf_docsis_mdd_upstream_active_channel_list_dschids_maps_ucds = -1;
987 static int hf_docsis_mdd_upstream_active_channel_list_dschids_maps_ucds_dschid = -1;
988 static int hf_docsis_mdd_upstream_active_channel_list_fdx_upstream_channel = -1;
989 static int hf_docsis_mdd_upstream_active_channel_list_fdx_subband_id = -1;
990 static int hf_docsis_mdd_upstream_ambiguity_resolution_channel_list_channel_id = -1;
991 static int hf_docsis_mdd_upstream_frequency_range = -1;
992 static int hf_docsis_mdd_symbol_clock_locking_indicator = -1;
993 static int hf_docsis_mdd_cm_status_event_control_subtype = -1;
994 static int hf_docsis_mdd_cm_status_event_control_length = -1;
995 static int hf_docsis_mdd_event_type = -1;
996 static int hf_docsis_mdd_maximum_event_holdoff_timer = -1;
997 static int hf_docsis_mdd_maximum_number_of_reports_per_event = -1;
998 static int hf_docsis_mdd_upstream_transmit_power_reporting = -1;
999 static int hf_docsis_mdd_dsg_da_to_dsid_subtype = -1;
1000 static int hf_docsis_mdd_dsg_da_to_dsid_length = -1;
1001 static int hf_docsis_mdd_dsg_da_to_dsid_association_da = -1;
1002 static int hf_docsis_mdd_dsg_da_to_dsid_association_dsid = -1;
1003 static int hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events = -1;
1004 static int hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_sequence_out_of_range = -1;
1005 static int hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_operating_on_battery_backup = -1;
1006 static int hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_returned_to_ac_power = -1;
1007 static int hf_docsis_mdd_extended_upstream_transmit_power_support = -1;
1008 
1009 static int hf_docsis_mdd_cmts_major_docsis_version = -1;
1010 static int hf_docsis_mdd_cmts_minor_docsis_version = -1;
1011 
1012 static int hf_docsis_mdd_cm_periodic_maintenance_timeout_indicator = -1;
1013 static int hf_docsis_mdd_dls_broadcast_and_multicast_delivery_method = -1;
1014 static int hf_docsis_mdd_cm_status_event_d31_ofdm_prof_fail = -1;
1015 static int hf_docsis_mdd_cm_status_event_d31_prim_down_chan_change = -1;
1016 static int hf_docsis_mdd_cm_status_event_d31_dpd_mismatch = -1;
1017 static int hf_docsis_mdd_cm_status_event_d31_deprecated = -1;
1018 static int hf_docsis_mdd_cm_status_event_d31_ncp_prof_fail = -1;
1019 static int hf_docsis_mdd_cm_status_event_d31_loss_fec_plc = -1;
1020 static int hf_docsis_mdd_cm_status_event_d31_ncp_prof_recover = -1;
1021 static int hf_docsis_mdd_cm_status_event_d31_fec_recover_on_plc = -1;
1022 static int hf_docsis_mdd_cm_status_event_d31_fec_recover_on_ofdm_prof = -1;
1023 static int hf_docsis_mdd_cm_status_event_d31_ofdma_prof_fail = -1;
1024 static int hf_docsis_mdd_cm_status_event_d31_map_stor_overflow_ind = -1;
1025 static int hf_docsis_mdd_cm_status_event_d31_ofdm_map_stor_almost_full_ind = -1;
1026 static int hf_docsis_mdd_cm_status_event_d31_reserved = -1;
1027 
1028 static int hf_docsis_mdd_diplexer_band_edge = -1;
1029 static int hf_docsis_mdd_diplexer_band_edge_length = -1;
1030 static int hf_docsis_mdd_diplexer_us_upper_band_edge = -1;
1031 static int hf_docsis_mdd_diplexer_ds_lower_band_edge = -1;
1032 static int hf_docsis_mdd_diplexer_ds_upper_band_edge = -1;
1033 
1034 static int hf_docsis_mdd_full_duplex_descriptor = -1;
1035 static int hf_docsis_mdd_full_duplex_descriptor_length = -1;
1036 static int hf_docsis_mdd_full_duplex_allocated_spectrum = -1;
1037 static int hf_docsis_mdd_full_duplex_total_number_of_sub_bands = -1;
1038 static int hf_docsis_mdd_full_duplex_sub_band_width = -1;
1039 static int hf_docsis_mdd_full_duplex_sub_band_descriptor = -1;
1040 static int hf_docsis_mdd_full_duplex_sub_band_descriptor_length = -1;
1041 static int hf_docsis_mdd_full_duplex_sub_band_id = -1;
1042 static int hf_docsis_mdd_full_duplex_sub_band_offset = -1;
1043 
1044 static int hf_docsis_bintrngreq_mddsgid = -1;
1045 static int hf_docsis_bintrngreq_capflags = -1;
1046 static int hf_docsis_bintrngreq_capflags_frag = -1;
1047 static int hf_docsis_bintrngreq_capflags_encrypt = -1;
1048 
1049 static int hf_docsis_dbcreq_number_of_fragments = -1;
1050 static int hf_docsis_dbcreq_fragment_sequence_number = -1;
1051 
1052 static int hf_docsis_dbcrsp_conf_code = -1;
1053 
1054 static int hf_docsis_dpv_flags = -1;
1055 static int hf_docsis_dpv_us_sf = -1;
1056 static int hf_docsis_dpv_n = -1;
1057 static int hf_docsis_dpv_start = -1;
1058 static int hf_docsis_dpv_end = -1;
1059 static int hf_docsis_dpv_ts_start = -1;
1060 static int hf_docsis_dpv_ts_end = -1;
1061 
1062 static int hf_docsis_cmstatus_e_t_mdd_t = -1;
1063 static int hf_docsis_cmstatus_e_t_qfl_f = -1;
1064 static int hf_docsis_cmstatus_e_t_s_o = -1;
1065 static int hf_docsis_cmstatus_e_t_mdd_r = -1;
1066 static int hf_docsis_cmstatus_e_t_qfl_r = -1;
1067 static int hf_docsis_cmstatus_e_t_t4_t = -1;
1068 static int hf_docsis_cmstatus_e_t_t3_e = -1;
1069 static int hf_docsis_cmstatus_e_t_rng_s = -1;
1070 static int hf_docsis_cmstatus_e_t_cm_b = -1;
1071 static int hf_docsis_cmstatus_e_t_cm_a = -1;
1072 static int hf_docsis_cmstatus_e_t_mac_removal = -1;
1073 static int hf_docsis_cmstatus_e_t_ds_ofdm_profile_failure = -1;
1074 static int hf_docsis_cmstatus_e_t_prim_ds_change = -1;
1075 static int hf_docsis_cmstatus_e_t_dpd_mismatch = -1;
1076 static int hf_docsis_cmstatus_e_t_ncp_profile_failure = -1;
1077 static int hf_docsis_cmstatus_e_t_plc_failure = -1;
1078 static int hf_docsis_cmstatus_e_t_ncp_profile_recovery =-1;
1079 static int hf_docsis_cmstatus_e_t_plc_recovery = -1;
1080 static int hf_docsis_cmstatus_e_t_ofdm_profile_recovery = -1;
1081 static int hf_docsis_cmstatus_e_t_ofdma_profile_failure = -1;
1082 static int hf_docsis_cmstatus_e_t_map_storage_overflow_indicator = -1;
1083 static int hf_docsis_cmstatus_e_t_map_storage_almost_full_indicator = -1;
1084 static int hf_docsis_cmstatus_e_t_unknown = -1;
1085 static int hf_docsis_cmstatus_status_event_ds_ch_id = -1;
1086 static int hf_docsis_cmstatus_status_event_us_ch_id = -1;
1087 static int hf_docsis_cmstatus_status_event_dsid = -1;
1088 static int hf_docsis_cmstatus_status_event_mac_address = -1;
1089 static int hf_docsis_cmstatus_status_event_ds_ofdm_profile_id = -1;
1090 static int hf_docsis_cmstatus_status_event_us_ofdma_profile_id = -1;
1091 static int hf_docsis_cmstatus_status_event_descr = -1;
1092 static int hf_docsis_cmstatus_tlv_data = -1;
1093 static int hf_docsis_cmstatus_type = -1;
1094 static int hf_docsis_cmstatus_length = -1;
1095 static int hf_docsis_cmstatus_status_event_tlv_data = -1;
1096 static int hf_docsis_cmstatus_status_event_type = -1;
1097 static int hf_docsis_cmstatus_status_event_length = -1;
1098 
1099 static int hf_docsis_cmctrl_tlv_mute = -1;
1100 static int hf_docsis_cmctrl_tlv_mute_timeout = -1;
1101 static int hf_docsis_cmctrl_tlv_reinit = -1;
1102 static int hf_docsis_cmctrl_tlv_disable_fwd = -1;
1103 static int hf_docsis_cmctrl_tlv_ds_event = -1;
1104 static int hf_docsis_cmctrl_tlv_us_event = -1;
1105 static int hf_docsis_cmctrl_tlv_event = -1;
1106 static int hf_docsis_cmctrlreq_tlv_data = -1;
1107 static int hf_docsis_cmctrlreq_type = -1;
1108 static int hf_docsis_cmctrlreq_length = -1;
1109 static int hf_docsis_cmctrlreq_us_type = -1;
1110 static int hf_docsis_cmctrlreq_us_length = -1;
1111 static int hf_docsis_cmctrl_us_event_ch_id = -1;
1112 static int hf_docsis_cmctrl_us_event_mask = -1;
1113 static int hf_docsis_cmctrl_ds_type = -1;
1114 static int hf_docsis_cmctrl_ds_length = -1;
1115 static int hf_docsis_cmctrl_ds_event_ch_id = -1;
1116 static int hf_docsis_cmctrl_ds_event_mask = -1;
1117 
1118 static int hf_docsis_regreqmp_sid = -1;
1119 static int hf_docsis_regreqmp_number_of_fragments = -1;
1120 static int hf_docsis_regreqmp_fragment_sequence_number = -1;
1121 static int hf_docsis_regrspmp_sid = -1;
1122 static int hf_docsis_regrspmp_response = -1;
1123 static int hf_docsis_regrspmp_number_of_fragments = -1;
1124 static int hf_docsis_regrspmp_fragment_sequence_number = -1;
1125 
1126 static int hf_docsis_emrsp_tlv_data = -1;
1127 static int hf_docsis_emrsp_tlv_type = -1;
1128 static int hf_docsis_emrsp_tlv_length = -1;
1129 static int hf_docsis_emrsp_tlv_holdoff_timer = -1;
1130 static int hf_docsis_emreq_req_power_mode = -1;
1131 static int hf_docsis_emreq_reserved = -1;
1132 static int hf_docsis_emrsp_rsp_code = -1;
1133 static int hf_docsis_emrsp_reserved = -1;
1134 static int hf_docsis_emrsp_tlv_unknown = -1;
1135 
1136 static int hf_docsis_ocd_tlv_unknown = -1;
1137 static int hf_docsis_ocd_ccc = -1;
1138 static int hf_docsis_ocd_tlv_four_trans_size = -1;
1139 static int hf_docsis_ocd_tlv_cycl_pref = -1;
1140 static int hf_docsis_ocd_tlv_roll_off = -1;
1141 static int hf_docsis_ocd_tlv_ofdm_spec_loc = -1;
1142 static int hf_docsis_ocd_tlv_time_int_depth = -1;
1143 static int hf_docsis_ocd_tlv_prim_cap_ind = -1;
1144 static int hf_docsis_ocd_tlv_subc_assign_type = -1;
1145 static int hf_docsis_ocd_tlv_subc_assign_value = -1;
1146 static int hf_docsis_ocd_subc_assign_subc_type = -1;
1147 static int hf_docsis_ocd_subc_assign_range = -1;
1148 static int hf_docsis_ocd_subc_assign_index = -1;
1149 static int hf_docsis_ocd_tlv_data = -1;
1150 static int hf_docsis_ocd_type = -1;
1151 static int hf_docsis_ocd_length = -1;
1152 
1153 static int hf_docsis_dpd_tlv_unknown = -1;
1154 static int hf_docsis_dpd_prof_id = -1;
1155 static int hf_docsis_dpd_ccc = -1;
1156 static int hf_docsis_dpd_tlv_subc_assign_type = -1;
1157 static int hf_docsis_dpd_tlv_subc_assign_value = -1;
1158 static int hf_docsis_dpd_subc_assign_range = -1;
1159 static int hf_docsis_dpd_tlv_subc_assign_reserved = -1;
1160 static int hf_docsis_dpd_tlv_subc_assign_modulation = -1;
1161 static int hf_docsis_dpd_subc_assign_index = -1;
1162 static int hf_docsis_dpd_tlv_subc_assign_vector_oddness = -1;
1163 static int hf_docsis_dpd_tlv_subc_assign_vector_reserved = -1;
1164 static int hf_docsis_dpd_tlv_subc_assign_vector_subc_start = -1;
1165 static int hf_docsis_dpd_tlv_subc_assign_vector_modulation_odd = -1;
1166 static int hf_docsis_dpd_tlv_subc_assign_vector_modulation_even = -1;
1167 static int hf_docsis_dpd_tlv_data = -1;
1168 static int hf_docsis_dpd_type = -1;
1169 static int hf_docsis_dpd_length = -1;
1170 
1171 static int hf_docsis_optreq_tlv_unknown = -1;
1172 static int hf_docsis_optreq_prof_id = -1;
1173 static int hf_docsis_optreq_opcode = -1;
1174 static int hf_docsis_optreq_reserved = -1;
1175 static int hf_docsis_optreq_tlv_data = -1;
1176 static int hf_docsis_optreq_type = -1;
1177 static int hf_docsis_optreq_length = -1;
1178 static int hf_docsis_optreq_reqstat_rxmer_stat_subc = -1;
1179 static int hf_docsis_optreq_reqstat_rxmer_subc_threshold_comp = -1;
1180 static int hf_docsis_optreq_reqstat_snr_marg_cand_prof = -1;
1181 static int hf_docsis_optreq_reqstat_codew_stat_cand_prof = -1;
1182 static int hf_docsis_optreq_reqstat_codew_thresh_comp_cand_prof = -1;
1183 static int hf_docsis_optreq_reqstat_ncp_field_stat = -1;
1184 static int hf_docsis_optreq_reqstat_ncp_crc_thresh_comp = -1;
1185 static int hf_docsis_optreq_reqstat_reserved = -1;
1186 static int hf_docsis_optreq_tlv_xrmer_thresh_data = -1;
1187 static int hf_docsis_optreq_xmer_thresh_params_type = -1;
1188 static int hf_docsis_optreq_xmer_thresh_params_length = -1;
1189 static int hf_docsis_optreq_tlv_xrmer_thresh_data_mod_order = -1;
1190 
1191 static int hf_docsis_optrsp_tlv_unknown = -1;
1192 static int hf_docsis_optrsp_prof_id = -1;
1193 static int hf_docsis_optrsp_reserved = -1;
1194 static int hf_docsis_optrsp_status = -1;
1195 static int hf_docsis_optrsp_tlv_data = -1;
1196 static int hf_docsis_optrsp_type = -1;
1197 static int hf_docsis_optrsp_length = -1;
1198 static int hf_docsis_optrsp_tlv_xrmer_snr_margin_data = -1;
1199 static int hf_docsis_optrsp_xmer_snr_margin_type = -1;
1200 static int hf_docsis_optrsp_xmer_snr_margin_length = -1;
1201 static int hf_docsis_optrsp_tlv_xrmer_snr_margin_data_rxmer_subc = -1;
1202 static int hf_docsis_optrsp_tlv_rxmer_snr_margin_data_snr_margin = -1;
1203 
1204 static int hf_docsis_optack_prof_id = -1;
1205 static int hf_docsis_optack_reserved = -1;
1206 
1207 static int hf_docsis_rba_tg_id = -1;
1208 static int hf_docsis_rba_ccc = -1;
1209 static int hf_docsis_rba_dcid = -1;
1210 static int hf_docsis_rba_control_byte_bitmask = -1;
1211 static int hf_docsis_rba_resource_block_change_bit = -1;
1212 static int hf_docsis_rba_expiration_time_valid_bit = -1;
1213 static int hf_docsis_rba_control_byte_bitmask_rsvd = -1;
1214 static int hf_docsis_rba_rba_time = -1;
1215 static int hf_docsis_rba_rba_expiration_time = -1;
1216 static int hf_docsis_rba_number_of_subbands = -1;
1217 static int hf_docsis_rba_subband_direction = -1;
1218 
1219 static int hf_docsis_mgt_upstream_chid = -1;
1220 static int hf_docsis_mgt_down_chid = -1;
1221 static int hf_docsis_mgt_tranid = -1;
1222 static int hf_docsis_mgt_dst_addr = -1;
1223 static int hf_docsis_mgt_src_addr = -1;
1224 static int hf_docsis_mgt_msg_len = -1;
1225 static int hf_docsis_mgt_dsap = -1;
1226 static int hf_docsis_mgt_ssap = -1;
1227 static int hf_docsis_mgt_30_transmit_power = -1;
1228 static int hf_docsis_mgt_31_transmit_power = -1;
1229 static int hf_docsis_mgt_control = -1;
1230 static int hf_docsis_mgt_version = -1;
1231 static int hf_docsis_mgt_type = -1;
1232 static int hf_docsis_mgt_rsvd = -1;
1233 static int hf_docsis_mgt_multipart = -1;
1234 static int hf_docsis_mgt_multipart_number_of_fragments = -1;
1235 static int hf_docsis_mgt_multipart_fragment_sequence_number = -1;
1236 
1237 static int hf_docsis_tlv_fragments = -1;
1238 static int hf_docsis_tlv_fragment = -1;
1239 static int hf_docsis_tlv_fragment_overlap = -1;
1240 static int hf_docsis_tlv_fragment_overlap_conflict = -1;
1241 static int hf_docsis_tlv_fragment_multiple_tails = -1;
1242 static int hf_docsis_tlv_fragment_too_long_fragment = -1;
1243 static int hf_docsis_tlv_fragment_error = -1;
1244 static int hf_docsis_tlv_fragment_count = -1;
1245 static int hf_docsis_tlv_reassembled_in = -1;
1246 static int hf_docsis_tlv_reassembled_length = -1;
1247 static int hf_docsis_tlv_reassembled_data = -1;
1248 
1249 static int hf_docsis_tlv_reassembled = -1;
1250 
1251 static gint ett_docsis_sync = -1;
1252 
1253 static gint ett_docsis_ucd = -1;
1254 static gint ett_docsis_tlv = -1;
1255 static gint ett_docsis_burst_tlv = -1;
1256 
1257 static gint ett_docsis_map = -1;
1258 static gint ett_docsis_map_ie = -1;
1259 static gint ett_docsis_map_probe_ie = -1;
1260 
1261 
1262 static gint ett_docsis_rngreq = -1;
1263 
1264 static gint ett_docsis_rngrsp = -1;
1265 static gint ett_docsis_rngrsptlv = -1;
1266 static gint ett_docsis_rngrsp_tlv_transmit_equalization_encodings = -1;
1267 static gint ett_docsis_rngrsp_tlv_transmit_equalization_encodings_coef = -1;
1268 static gint ett_docsis_rngrsp_tlv_commanded_power_subtlv = -1;
1269 static gint ett_docsis_rngrsp_tlv_commanded_power = -1;
1270 
1271 
1272 static gint ett_docsis_regreq = -1;
1273 static gint ett_docsis_regrsp = -1;
1274 
1275 static gint ett_docsis_emreq = -1;
1276 static gint ett_docsis_emrsp = -1;
1277 static gint ett_docsis_emrsp_tlv = -1;
1278 static gint ett_docsis_emrsp_tlvtlv = -1;
1279 
1280 static gint ett_docsis_uccreq = -1;
1281 static gint ett_docsis_uccrsp = -1;
1282 
1283 static gint ett_docsis_bpkmreq = -1;
1284 static gint ett_docsis_bpkmrsp = -1;
1285 static gint ett_docsis_bpkmattr = -1;
1286 static gint ett_docsis_bpkmattr_cmid = -1;
1287 static gint ett_docsis_bpkmattr_scap = -1;
1288 static gint ett_docsis_bpkmattr_tekp = -1;
1289 static gint ett_docsis_bpkmattr_sadsc = -1;
1290 static gint ett_docsis_bpkmattr_saqry = -1;
1291 static gint ett_docsis_bpkmattr_dnld = -1;
1292 static gint ett_docsis_bpkmattrtlv = -1;
1293 
1294 static gint ett_docsis_regack = -1;
1295 
1296 static gint ett_docsis_dsareq = -1;
1297 static gint ett_docsis_dsarsp = -1;
1298 static gint ett_docsis_dsaack = -1;
1299 
1300 static gint ett_docsis_dscreq = -1;
1301 static gint ett_docsis_dscrsp = -1;
1302 static gint ett_docsis_dscack = -1;
1303 
1304 static gint ett_docsis_dsdreq = -1;
1305 static gint ett_docsis_dsdrsp = -1;
1306 
1307 static gint ett_docsis_dccreq = -1;
1308 static gint ett_docsis_dccreq_tlv = -1;
1309 static gint ett_docsis_dccreq_ds_params = -1;
1310 static gint ett_docsis_dccreq_sf_sub = -1;
1311 static gint ett_docsis_dccrsp = -1;
1312 static gint ett_docsis_dccrsp_cm_jump_time = -1;
1313 static gint ett_docsis_dccrsp_tlv = -1;
1314 static gint ett_docsis_dccack = -1;
1315 static gint ett_docsis_dccack_tlv = -1;
1316 
1317 static gint ett_docsis_intrngreq = -1;
1318 
1319 static gint ett_docsis_dcd = -1;
1320 static gint ett_docsis_dcd_cfr = -1;
1321 static gint ett_docsis_dcd_cfr_ip = -1;
1322 static gint ett_docsis_dcd_rule = -1;
1323 static gint ett_docsis_dcd_clid = -1;
1324 static gint ett_docsis_dcd_cfg = -1;
1325 static gint ett_docsis_dcd_tlv = -1;
1326 
1327 static gint ett_docsis_mdd = -1;
1328 static gint ett_tlv = -1;
1329 static gint ett_sub_tlv = -1;
1330 static gint ett_docsis_mdd_cm_status_ev_en_for_docsis31 = -1;
1331 static gint ett_docsis_mdd_ds_active_channel_list = -1;
1332 static gint ett_docsis_mdd_ds_service_group = -1;
1333 static gint ett_docsis_mdd_channel_profile_reporting_control = -1;
1334 static gint ett_docsis_mdd_ip_init_param = -1;
1335 static gint ett_docsis_mdd_up_active_channel_list = -1;
1336 static gint ett_docsis_mdd_upstream_active_channel_list_dschids_maps_ucds_dschids = -1;
1337 static gint ett_docsis_mdd_cm_status_event_control = -1;
1338 static gint ett_docsis_mdd_dsg_da_to_dsid = -1;
1339 static gint ett_docsis_mdd_diplexer_band_edge = -1;
1340 static gint ett_docsis_mdd_full_duplex_descriptor = -1;
1341 static gint ett_docsis_mdd_full_duplex_sub_band_descriptor = -1;
1342 
1343 static gint ett_docsis_bintrngreq = -1;
1344 
1345 static gint ett_docsis_dbcreq = -1;
1346 static gint ett_docsis_dbcrsp = -1;
1347 static gint ett_docsis_dbcack = -1;
1348 
1349 static gint ett_docsis_dpvreq = -1;
1350 static gint ett_docsis_dpvrsp = -1;
1351 
1352 static gint ett_docsis_cmstatus = -1;
1353 static gint ett_docsis_cmstatus_tlv = -1;
1354 static gint ett_docsis_cmstatus_tlvtlv = -1;
1355 static gint ett_docsis_cmstatus_status_event_tlv = -1;
1356 static gint ett_docsis_cmstatus_status_event_tlvtlv = -1;
1357 
1358 static gint ett_docsis_cmstatusack = -1;
1359 
1360 static gint ett_docsis_cmctrlreq = -1;
1361 static gint ett_docsis_cmctrlreq_tlv = -1;
1362 static gint ett_docsis_cmctrlreq_tlvtlv = -1;
1363 static gint ett_docsis_cmctrl_tlv_us_event = -1;
1364 static gint ett_docsis_cmctrl_tlv_ds_event = -1;
1365 static gint ett_docsis_cmctrlrsp = -1;
1366 
1367 static gint ett_docsis_regreqmp = -1;
1368 static gint ett_docsis_regrspmp = -1;
1369 
1370 static gint ett_docsis_ocd = -1;
1371 static gint ett_docsis_ocd_tlv = -1;
1372 static gint ett_docsis_ocd_tlvtlv = -1;
1373 
1374 static gint ett_docsis_dpd = -1;
1375 static gint ett_docsis_dpd_tlv = -1;
1376 static gint ett_docsis_dpd_tlvtlv = -1;
1377 static gint ett_docsis_dpd_tlv_subcarrier_assignment = -1;
1378 static gint ett_docsis_dpd_tlv_subcarrier_assignment_vector = -1;
1379 
1380 static gint ett_docsis_optreq = -1;
1381 static gint ett_docsis_optreq_tlv = -1;
1382 static gint ett_docsis_optreq_tlvtlv = -1;
1383 static gint ett_docsis_optreq_tlv_rxmer_thresh_params = -1;
1384 static gint ett_docsis_optreq_tlv_rxmer_thresh_params_tlv = -1;
1385 
1386 static gint ett_docsis_optrsp = -1;
1387 static gint ett_docsis_optrsp_tlv = -1;
1388 static gint ett_docsis_optrsp_tlvtlv = -1;
1389 static gint ett_docsis_optrsp_tlv_rxmer_snr_margin_data = -1;
1390 static gint ett_docsis_optrsp_tlv_rxmer_snr_margin_tlv =-1;
1391 
1392 static gint ett_docsis_optack = -1;
1393 
1394 static gint ett_docsis_rba = -1;
1395 static gint ett_docsis_rba_control_byte = -1;
1396 
1397 static gint ett_docsis_mgmt = -1;
1398 static gint ett_mgmt_pay = -1;
1399 
1400 static gint ett_docsis_tlv_fragments = -1;
1401 static gint ett_docsis_tlv_fragment = -1;
1402 static gint ett_docsis_tlv_reassembled = -1;
1403 
1404 static expert_field ei_docsis_mgmt_tlvlen_bad = EI_INIT;
1405 static expert_field ei_docsis_mgmt_tlvtype_unknown = EI_INIT;
1406 static expert_field ei_docsis_mgmt_version_unknown = EI_INIT;
1407 
1408 static dissector_table_t docsis_mgmt_dissector_table;
1409 static dissector_handle_t docsis_tlv_handle;
1410 static dissector_handle_t docsis_ucd_handle;
1411 
1412 static const value_string channel_tlv_vals[] = {
1413   {UCD_SYMBOL_RATE,  "Symbol Rate"},
1414   {UCD_FREQUENCY,    "Frequency"},
1415   {UCD_PREAMBLE,     "Preamble Pattern"},
1416   {UCD_BURST_DESCR,  "Burst Descriptor Type 4"},
1417   {UCD_BURST_DESCR5, "Burst Descriptor Type 5"},
1418   {UCD_EXT_PREAMBLE, "Extended Preamble Pattern"},
1419   {UCD_SCDMA_MODE_ENABLED, "S-CDMA Mode Enabled"},
1420   {UCD_SCDMA_SPREADING_INTERVAL, "S-CDMA Spreading Intervals per Frame"},
1421   {UCD_SCDMA_CODES_PER_MINI_SLOT, "S-CDMA Codes per Mini-slot"},
1422   {UCD_SCDMA_ACTIVE_CODES, "S-CDMA Number of Active Codes"},
1423   {UCD_SCDMA_CODE_HOPPING_SEED, "S-CDMA Code Hopping Seed"},
1424   {UCD_SCDMA_US_RATIO_NUM, "S-CDMA US ratio numerator M"},
1425   {UCD_SCDMA_US_RATIO_DENOM, "S-CDMA US ratio denominator N"},
1426   {UCD_SCDMA_TIMESTAMP_SNAPSHOT, "S-CDMA Timestamp Snapshot"},
1427   {UCD_MAINTAIN_POWER_SPECTRAL_DENSITY, "Maintain Power Spectral Density"},
1428   {UCD_RANGING_REQUIRED, "Ranging Required"},
1429   {UCD_MAX_SCHEDULED_CODES, "S-CDMA Maximum Scheduled Codes"},
1430   {UCD_RANGING_HOLD_OFF_PRIORITY_FIELD, "Ranging Hold-Off Priority Field"},
1431   {UCD_RANGING_CHANNEL_CLASS_ID, "Ranging Channel Class ID"},
1432   {UCD_SCDMA_SELECTION_ACTIVE_CODES_AND_CODE_HOPPING, "S-CDMA Selection Mode for Active Codes and Code Hopping"},
1433   {UCD_SCDMA_SELECTION_STRING_FOR_ACTIVE_CODES, "S-CDMA Selection String for Active Codes"},
1434   {UCD_HIGHER_UCD_FOR_SAME_UCID,        "Higher UCD for the same UCID present bitmap"},
1435   {UCD_BURST_DESCR23,                   "Burst Descriptor Type 23"},
1436   {UCD_CHANGE_IND_BITMASK,              "UCD Change Indicator Bitmask"},
1437   {UCD_OFDMA_TIMESTAMP_SNAPSHOT,        "OFDMA Timestamp Snapshot"},
1438   {UCD_OFDMA_CYCLIC_PREFIX_SIZE,        "OFDMA Cyclic Prefix Size"},
1439   {UCD_OFDMA_ROLLOFF_PERIOD_SIZE,       "OFDMA Rolloff Period Size"},
1440   {UCD_SUBCARRIER_SPACING,              "Subcarrier Spacing"},
1441   {UCD_CENTER_FREQ_SUBC_0,              "Center Frequency of Subcarrier 0"},
1442   {UCD_SUBC_EXCL_BAND,                  "Subcarrier Exclusion Band"},
1443   {UCD_UNUSED_SUBC_SPEC,                "Unused Subcarrier Specification"},
1444   {UCD_SYMB_IN_OFDMA_FRAME,             "Symbols in OFDMA frame"},
1445   {UCD_RAND_SEED,                       "Randomization Seed"},
1446   {0, NULL}
1447 };
1448 
1449 static const value_string burst_tlv_vals[] = {
1450   {UCD_MODULATION,                      "Modulation Type"},
1451   {UCD_DIFF_ENCODING,                   "Differential Encoding"},
1452   {UCD_PREAMBLE_LEN,                    "Preamble Length"},
1453   {UCD_PREAMBLE_VAL_OFF,                "Preamble Value Offset"},
1454   {UCD_FEC,                             "FEC Error Correction (T)"},
1455   {UCD_FEC_CODEWORD,                    "FEC Codeword Information Bytes (k)"},
1456   {UCD_SCRAMBLER_SEED,                  "Scrambler Seed"},
1457   {UCD_MAX_BURST,                       "Maximum Burst Size"},
1458   {UCD_GUARD_TIME,                      "Guard Time Size"},
1459   {UCD_LAST_CW_LEN,                     "Last Codeword Length"},
1460   {UCD_SCRAMBLER_ONOFF,                 "Scrambler on/off"},
1461   {UCD_RS_INT_DEPTH,                    "R-S Interleaver Depth (Ir)"},
1462   {UCD_RS_INT_BLOCK,                    "R-S Interleaver Block Size (Br)"},
1463   {UCD_PREAMBLE_TYPE,                   "Preamble Type"},
1464   {UCD_SCMDA_SCRAMBLER_ONOFF,           "S-CDMA Spreader on/off"},
1465   {UCD_SCDMA_CODES_PER_SUBFRAME,        "S-CDMA Codes per Subframe"},
1466   {UCD_SCDMA_FRAMER_INT_STEP_SIZE,      "S-CDMA Framer Interleaving Step Size"},
1467   {UCD_TCM_ENABLED,                     "TCM Encoding"},
1468   {UCD_SUBC_INIT_RANG,                  "Subcarriers (Nir) Initial Ranging"},
1469   {UCD_SUBC_FINE_RANG,                  "Subcarriers (Nfr) Fine Ranging"},
1470   {UCD_OFDMA_PROFILE,                   "OFDMA Profile"},
1471   {UCD_OFDMA_IR_POWER_CONTROL,          "OFDMA Power Control (Ir)"},
1472   {0, NULL}
1473 };
1474 
1475 static const value_string mgmt_type_vals[] = {
1476   {MGT_SYNC,           "Timing Synchronisation"},
1477   {MGT_UCD,            "Upstream Channel Descriptor"},
1478   {MGT_TYPE29UCD,      "Upstream Channel Descriptor Type 29"},
1479   {MGT_TYPE35UCD,      "Upstream Channel Descriptor Type 35"},
1480   {MGT_MAP,            "Upstream Bandwidth Allocation"},
1481   {MGT_RNG_REQ,        "Ranging Request"},
1482   {MGT_RNG_RSP,        "Ranging Response"},
1483   {MGT_REG_REQ,        "Registration Request"},
1484   {MGT_REG_RSP,        "Registration Response"},
1485   {MGT_UCC_REQ,        "Upstream Channel Change Request"},
1486   {MGT_UCC_RSP,        "Upstream Channel Change Response"},
1487   {MGT_TRI_TCD,        "Telephony Channel Descriptor"},
1488   {MGT_TRI_TSI,        "Termination System Information"},
1489   {MGT_BPKM_REQ,       "Privacy Key Management Request"},
1490   {MGT_BPKM_RSP,       "Privacy Key Management Response"},
1491   {MGT_REG_ACK,        "Registration Acknowledge"},
1492   {MGT_DSA_REQ,        "Dynamic Service Addition Request"},
1493   {MGT_DSA_RSP,        "Dynamic Service Addition Response"},
1494   {MGT_DSA_ACK,        "Dynamic Service Addition  Acknowledge"},
1495   {MGT_DSC_REQ,        "Dynamic Service Change Request"},
1496   {MGT_DSC_RSP,        "Dynamic Service Change Response"},
1497   {MGT_DSC_ACK,        "Dynamic Service Change Acknowledge"},
1498   {MGT_DSD_REQ,        "Dynamic Service Delete Request"},
1499   {MGT_DSD_RSP,        "Dynamic Service Delete Response"},
1500   {MGT_DCC_REQ,        "Dynamic Channel Change Request"},
1501   {MGT_DCC_RSP,        "Dynamic Channel Change Response"},
1502   {MGT_DCC_ACK,        "Dynamic Channel Change Acknowledge"},
1503   {MGT_DCI_REQ,        "Device Class Identification Request"},
1504   {MGT_DCI_RSP,        "Device Class Identification Response"},
1505   {MGT_UP_DIS,         "Upstream Channel Disable"},
1506   {MGT_INIT_RNG_REQ,   "Initial Ranging Request"},
1507   {MGT_TEST_REQ,       "Test Request Message"},
1508   {MGT_DS_CH_DESC,     "Downstream Channel Descriptor"},
1509   {MGT_MDD,            "MAC Domain Descriptor"},
1510   {MGT_B_INIT_RNG_REQ, "Bonded Initial Ranging Request"},
1511   {MGT_DBC_REQ,        "Dynamic Bonding Change Request"},
1512   {MGT_DBC_RSP,        "Dynamic Bonding Change Response"},
1513   {MGT_DBC_ACK,        "Dynamic Bonding Change Acknowledge"},
1514   {MGT_DPV_REQ,        "DOCSIS Path Verify Request"},
1515   {MGT_DPV_RSP,        "DOCSIS Path Verify Response"},
1516   {MGT_CM_STATUS,      "CM Status Report"},
1517   {MGT_CM_CTRL_REQ,    "CM Control Request"},
1518   {MGT_CM_CTRL_RSP,    "CM Control Response"},
1519   {MGT_REG_REQ_MP,     "Multipart Registration Request"},
1520   {MGT_REG_RSP_MP,     "Multipart Registration Response"},
1521   {MGT_EM_REQ,         "Energy Management Request"},
1522   {MGT_EM_RSP,         "Energy Management Response"},
1523   {MGT_CM_STATUS_ACK,     "Status Report Acknowledge"},
1524   {MGT_OCD,            "OFDM Channel Descriptor"},
1525   {MGT_DPD,            "Downstream Profile Descriptor"},
1526   {MGT_TYPE51UCD,      "Upstream Channel Descriptor Type 51"},
1527   {MGT_ODS_REQ,        "ODS-REQ"},
1528   {MGT_ODS_RSP,        "ODS-RSP"},
1529   {MGT_OPT_REQ,        "OFDM Downstream Profile Test Request"},
1530   {MGT_OPT_RSP,        "OFDM Downstream Profile Test Response"},
1531   {MGT_OPT_ACK,        "OFDM Downstream Profile Test Acknowledge"},
1532   {MGT_OPT_ACK,        "OFDM Downstream Profile Test Acknowledge"},
1533   {MGT_DPT_REQ,        "DOCSIS Time Protocol Request"},
1534   {MGT_DPT_RSP,        "DOCSIS Time Protocol Response"},
1535   {MGT_DPT_ACK,        "DOCSIS Time Protocol Acknowledge"},
1536   {MGT_DPT_INFO,       "DOCSIS Time Protocol Information"},
1537   {MGT_RBA_SW,         "DOCSIS Resource Block Assignment"},
1538   {0, NULL}
1539 };
1540 
1541 static const value_string on_off_vals[] = {
1542   {1, "On"},
1543   {2, "Off"},
1544   {0, NULL}
1545 };
1546 
1547 static const value_string inhibit_allow_vals[] = {
1548   {0, "Inhibit Initial Ranging"},
1549   {1, "Ranging Allowed"},
1550   {0, NULL},
1551 };
1552 
1553 static const value_string mod_vals[] = {
1554   {1, "QPSK"},
1555   {2, "16-QAM"},
1556   {3, "8-QAM"},
1557   {4, "32-QAM"},
1558   {5, "64-QAM"},
1559   {6, "128-QAM (SCDMA-only)"},
1560   {7, "Reserved for C-DOCSIS"},
1561   {0, NULL}
1562 };
1563 
1564 static const value_string iuc_vals[] = {
1565   {IUC_REQUEST,                  "Request"},
1566   {IUC_REQ_DATA,                 "REQ/Data"},
1567   {IUC_INIT_MAINT,               "Initial Maintenance"},
1568   {IUC_STATION_MAINT,            "Station Maintenance"},
1569   {IUC_SHORT_DATA_GRANT,         "Short Data Grant"},
1570   {IUC_LONG_DATA_GRANT,          "Long Data Grant"},
1571   {IUC_NULL_IE,                  "NULL IE"},
1572   {IUC_DATA_ACK,                 "Data Ack"},
1573   {IUC_ADV_PHY_SHORT_DATA_GRANT, "Advanced Phy Short Data Grant"},
1574   {IUC_ADV_PHY_LONG_DATA_GRANT,  "Advanced Phy Long Data Grant"},
1575   {IUC_ADV_PHY_UGS,              "Advanced Phy UGS"},
1576   {IUC_DATA_PROFILE_IUC12,       "Data Profile IUC12"},
1577   {IUC_DATA_PROFILE_IUC13,       "Data Profile IUC13"},
1578   {IUC_RESERVED14,               "Reserved"},
1579   {IUC_EXPANSION,                "Expanded IUC"},
1580   {0, NULL}
1581 };
1582 
1583 static const true_false_string mer_vals = {"measure RxMER at the CMTS on this probe", "do not measure RxMER at the CMTS on this probe"};
1584 
1585 static const true_false_string pw_vals = {"transmit using alternate power setting specified by the Start Subc field.", "transmit using normal power settings"};
1586 
1587 static const true_false_string eq_vals = {"equalizer disabled", "equalizer enabled"};
1588 
1589 static const true_false_string st_vals = {"stagger", "no stagger"};
1590 
1591 static const value_string last_cw_len_vals[] = {
1592   {1, "Fixed"},
1593   {2, "Shortened"},
1594   {0, NULL}
1595 };
1596 
1597 static const value_string ranging_req_vals[] = {
1598   {0, "No ranging required"},
1599   {1, "Unicast initial ranging required"},
1600   {2, "Broadcast initial ranging required"},
1601   {0, NULL}
1602 };
1603 
1604 static const value_string rng_stat_vals[] = {
1605   {1, "Continue"},
1606   {2, "Abort"},
1607   {3, "Success"},
1608   {0, NULL}
1609 };
1610 
1611 static void
1612 two_compl_frac(
1613     char *buf,
1614     gint16 value)
1615 {
1616     gint16 frac = value;
1617 
1618 
1619     g_snprintf(buf, ITEM_LABEL_LENGTH,
1620         "%f",
1621         frac/16384.0);
1622 }
1623 
1624 static const value_string rngrsp_tlv_vals[] = {
1625   {RNGRSP_TIMING,            "Timing Adjust (6.25us/64)"},
1626   {RNGRSP_PWR_LEVEL_ADJ,     "Power Level Adjust (0.25dB units)"},
1627   {RNGRSP_OFFSET_FREQ_ADJ,   "Offset Freq Adjust (Hz)"},
1628   {RNGRSP_TRANSMIT_EQ_ADJ,   "Transmit Equalization Adjust"},
1629   {RNGRSP_RANGING_STATUS,    "Ranging Status"},
1630   {RNGRSP_DOWN_FREQ_OVER,    "Downstream Frequency Override (Hz)"},
1631   {RNGRSP_UP_CHID_OVER,      "Upstream Channel ID Override"},
1632   {RNGRSP_TRANSMIT_EQ_SET,   "Transmit Equalization Set"},
1633   {RNGRSP_T4_TIMEOUT_MULTIPLIER, "T4 Timeout Multiplier"},
1634   {RNGRSP_DYNAMIC_RANGE_WINDOW_UPPER_EDGE, "Dynamic Range Window Upper Edge"},
1635   {RNGRSP_TRANSMIT_EQ_ADJUST_OFDMA_CHANNELS, "Transmit Equalization Adjust for OFDMA Channels"},
1636   {RNGRSP_TRANSMIT_EQ_SET_OFDMA_CHANNELS, "Transmit Equalization Set for OFDMA Channels"},
1637   {RNGRSP_COMMANDED_POWER, "Commanded Power"},
1638   {0, NULL}
1639 };
1640 
1641 
1642 static const value_string rngrsp_tlv_commanded_power_subtlv_vals[] = {
1643   {RNGRSP_COMMANDED_POWER_DYNAMIC_RANGE_WINDOW, "Dynamic Range Window"},
1644   {RNGRSP_COMMANDED_POWER_UCID_AND_POWER_LEVEL_LIST, "List of Upstream Channel IDs and Corresponding Transmit Power Levels"},
1645   {0, NULL}
1646 };
1647 
1648 static const value_string code_field_vals[] = {
1649   { 0, "Reserved"},
1650   { 1, "Reserved"},
1651   { 2, "Reserved"},
1652   { 3, "Reserved"},
1653   { 4, "Auth Request"},
1654   { 5, "Auth Reply"},
1655   { 6, "Auth Reject"},
1656   { 7, "Key Request"},
1657   { 8, "Key Reply"},
1658   { 9, "Key Reject"},
1659   {10, "Auth Invalid"},
1660   {11, "TEK Invalid"},
1661   {12, "Authent Info"},
1662   {13, "Map Request"},
1663   {14, "Map Reply"},
1664   {15, "Map Reject"},
1665   {0, NULL},
1666 };
1667 
1668 static const value_string ds_mod_type_vals[] = {
1669   {0 , "64 QAM"},
1670   {1 , "256 QAM"},
1671   {0, NULL}
1672 };
1673 
1674 static const value_string ds_sym_rate_vals[] = {
1675   {0 , "5.056941 Msym/sec"},
1676   {1 , "5.360537 Msym/sec"},
1677   {2 , "6.952 Msym/sec"},
1678   {0, NULL}
1679 };
1680 static const value_string init_tech_vals[] = {
1681   {0 , "Reinitialize MAC"},
1682   {1 , "Broadcast Init RNG on new chanbefore normal op"},
1683   {2 , "Unicast RNG on new chan before normal op"},
1684   {3 , "Either Unicast or broadcast RNG on new chan before normal op"},
1685   {4 , "Use new chan directly without re-init or RNG"},
1686   {0, NULL}
1687 };
1688 
1689 static const value_string dcc_tlv_vals[] = {
1690   {DCCREQ_UP_CHAN_ID, "Up Channel ID"},
1691   {DCCREQ_DS_PARAMS, "Downstream Params Encodings"},
1692   {DCCREQ_INIT_TECH, "Initialization Technique"},
1693   {DCCREQ_UCD_SUB, "UCD Substitution"},
1694   {DCCREQ_SAID_SUB, "SAID Sub"},
1695   {DCCREQ_SF_SUB, "Service Flow Substitution Encodings"},
1696   {DCCREQ_CMTS_MAC_ADDR, "CMTS MAC Address"},
1697   {DCCREQ_KEY_SEQ_NUM, "Auth Key Sequence Number"},
1698   {DCCREQ_HMAC_DIGEST, "HMAC-DigestNumber"},
1699   {0, NULL}
1700 };
1701 
1702 static const value_string ds_param_subtlv_vals[] = {
1703   {DCCREQ_DS_FREQ, "Frequency"},
1704   {DCCREQ_DS_MOD_TYPE, "Modulation Type"},
1705   {DCCREQ_DS_SYM_RATE, "Symbol Rate"},
1706   {DCCREQ_DS_INTLV_DEPTH, "Interleaver Depth"},
1707   {DCCREQ_DS_CHAN_ID, "Downstream Channel ID"},
1708   {DCCREQ_DS_SYNC_SUB, "SYNC Substitution"},
1709   {DCCREQ_DS_OFDM_BLOCK_FREQ, "OFDM Block Frequency"},
1710   {0, NULL}
1711 };
1712 
1713 static const value_string sf_sub_subtlv_vals[] = {
1714   {DCCREQ_SF_SFID, "SFID"},
1715   {DCCREQ_SF_SID, "SID"},
1716   {DCCREQ_SF_UNSOL_GRANT_TREF, "Unsolicited Grant Time Reference"},
1717   {0, NULL}
1718 };
1719 
1720 static const value_string dccrsp_tlv_vals[] = {
1721   {DCCRSP_CM_JUMP_TIME, "CM Jump Time Encodings"},
1722   {DCCRSP_KEY_SEQ_NUM, "Auth Key Sequence Number"},
1723   {DCCRSP_HMAC_DIGEST, "HMAC-Digest Number"},
1724   {0, NULL}
1725 };
1726 
1727 static const value_string cm_jump_subtlv_vals[] = {
1728   {DCCRSP_CM_JUMP_TIME_LENGTH, "Length of Jump"},
1729   {DCCRSP_CM_JUMP_TIME_START, "Start Time of Jump"},
1730   {0, NULL}
1731 };
1732 
1733 static const value_string dccack_tlv_vals[] = {
1734   {DCCACK_HMAC_DIGEST, "HMAC-DigestNumber"},
1735   {DCCACK_KEY_SEQ_NUM, "Auth Key Sequence Number"},
1736   {0, NULL}
1737 };
1738 
1739 static const value_string max_scheduled_codes_vals[] = {
1740   {1, "Enabled"},
1741   {2, "Disabled"},
1742   {0, NULL}
1743 };
1744 
1745 static const value_string dcd_tlv_vals[] = {
1746   {DCD_DOWN_CLASSIFIER, "DCD_CFR Encodings"},
1747   {DCD_DSG_RULE, "DCD DSG Rule Encodings"},
1748   {DCD_DSG_CONFIG, "DCD DSG Config Encodings"},
1749   {0, NULL}
1750 };
1751 
1752 static const value_string dcd_down_classifier_vals[] = {
1753   {DCD_CFR_ID, "Downstream Classifier ID"},
1754   {DCD_CFR_RULE_PRI, "Downstream Classifier Rule Priority"},
1755   {DCD_CFR_IP_CLASSIFIER, "DCD_CFR_IP Encodings"},
1756   {0, NULL}
1757 };
1758 
1759 static const value_string dcd_dsg_rule_vals[] = {
1760   {DCD_RULE_ID, "DSG Rule ID"},
1761   {DCD_RULE_PRI, "DSG Rule Priority"},
1762   {DCD_RULE_UCID_RNG, "DSG Rule UCID Range"},
1763   {DCD_RULE_CLIENT_ID, "DCD Rule ClientID Encodings"},
1764   {DCD_RULE_TUNL_ADDR, "DSG Rule Tunnel MAC Address"},
1765   {DCD_RULE_CFR_ID, "DSG Rule Classifier ID"},
1766   {DCD_RULE_VENDOR_SPEC, "DSG Rule Vendor Specific Parameters"},
1767   {0, NULL}
1768 };
1769 
1770 static const value_string dcd_clid_vals[] = {
1771   {DCD_CLID_BCAST_ID, "DSG Rule Client ID Broadcast ID"},
1772   {DCD_CLID_KNOWN_MAC_ADDR, "DSG Rule Client ID Known MAC Address"},
1773   {DCD_CLID_CA_SYS_ID, "DSG Rule Client ID CA System ID"},
1774   {DCD_CLID_APP_ID, "DSG Rule Client ID Application ID"},
1775   {0, NULL}
1776 };
1777 
1778 static const value_string dcd_cfr_ip_vals[] = {
1779   {DCD_CFR_IP_SOURCE_ADDR, "Downstream Classifier IP Source Address"},
1780   {DCD_CFR_IP_SOURCE_MASK, "Downstream Classifier IP Source Mask"},
1781   {DCD_CFR_IP_DEST_ADDR, "Downstream Classifier IP Destination Address"},
1782   {DCD_CFR_IP_DEST_MASK, "Downstream Classifier IP Destination Mask"},
1783   {DCD_CFR_TCPUDP_SRCPORT_START, "Downstream Classifier IP TCP/UDP Source Port Start"},
1784   {DCD_CFR_TCPUDP_SRCPORT_END, "Downstream Classifier IP TCP/UDP Source Port End"},
1785   {DCD_CFR_TCPUDP_DSTPORT_START, "Downstream Classifier IP TCP/UDP Destination Port Start"},
1786   {DCD_CFR_TCPUDP_DSTPORT_END, "Downstream Classifier IP TCP/UDP Destination Port End"},
1787   {0, NULL}
1788 };
1789 
1790 static const value_string dcd_cfg_vals[] = {
1791   {DCD_CFG_CHAN_LST, "DSG Configuration Channel"},
1792   {DCD_CFG_TDSG1, "DSG Initialization Timeout (Tdsg1)"},
1793   {DCD_CFG_TDSG2, "DSG Initialization Timeout (Tdsg2)"},
1794   {DCD_CFG_TDSG3, "DSG Initialization Timeout (Tdsg3)"},
1795   {DCD_CFG_TDSG4, "DSG Initialization Timeout (Tdsg4)"},
1796   {DCD_CFG_VENDOR_SPEC, "DSG Configuration Vendor Specific Parameters"},
1797   {0, NULL}
1798 };
1799 
1800 static const value_string J83_annex_vals[] = {
1801   {J83_ANNEX_A, "J.83 Annex A"},
1802   {J83_ANNEX_B, "J.83 Annex B"},
1803   {J83_ANNEX_C, "J.83 Annex C"},
1804   {0, NULL}
1805 };
1806 
1807 static const value_string modulation_order_vals[] = {
1808   {QAM64,  "64-QAM"},
1809   {QAM256, "256-QAM"},
1810   {0, NULL}
1811 };
1812 
1813 static const value_string primary_capable_vals[] = {
1814   {NOT_PRIMARY_CAPABLE,		"Channel is not primary-capable"},
1815   {PRIMARY_CAPABLE,     	"Channel is primary-capable"},
1816   {FDX_DOWNSTREAM_CHANNEL,	"FDX downstream channel"},
1817   {0, NULL}
1818 };
1819 
1820 static const value_string map_ucd_transport_indicator_vals[] = {
1821   {CANNOT_CARRY_MAP_UCD, "Channel cannot carry MAPs and UCDs for the MAC domain for which the MDD is sent"},
1822   {CAN_CARRY_MAP_UCD,    "Channel can carry MAPs and UCDs for the MAC domain for which the MDD is sent"},
1823   {0, NULL}
1824 };
1825 
1826 static const value_string tukey_raised_cosine_vals[] = {
1827   {TUKEY_0TS,   "0 "UTF8_MICRO_SIGN"s (0 * Ts)"},
1828   {TUKEY_64TS,  "0.3125 "UTF8_MICRO_SIGN"s (64 * Ts)"},
1829   {TUKEY_128TS, "0.625 "UTF8_MICRO_SIGN"s (128 * Ts)"},
1830   {TUKEY_192TS, "0.9375 "UTF8_MICRO_SIGN"s (192 * Ts)"},
1831   {TUKEY_256TS, "1.25 "UTF8_MICRO_SIGN"s (256 * Ts)"},
1832   {0, NULL}
1833 };
1834 
1835 static const value_string cyclic_prefix_vals[] = {
1836   {CYCLIC_PREFIX_192_TS,  "0.9375 "UTF8_MICRO_SIGN"s (192 * Ts)"},
1837   {CYCLIC_PREFIX_256_TS,  "1.25 "UTF8_MICRO_SIGN"s (256 * Ts)"},
1838   {CYCLIC_PREFIX_512_TS,  "2.5 "UTF8_MICRO_SIGN"s (512 * Ts) 3"},
1839   {CYCLIC_PREFIX_768_TS,  "3.75 "UTF8_MICRO_SIGN"s (768 * Ts)"},
1840   {CYCLIC_PREFIX_1024_TS, "5 "UTF8_MICRO_SIGN"s (1024 * Ts)"},
1841   {0, NULL}
1842 };
1843 
1844 static const value_string spacing_vals[] = {
1845   {SPACING_25KHZ, "25kHz"},
1846   {SPACING_50KHZ, "50kHz"},
1847   {0, NULL}
1848 };
1849 
1850 static const value_string bpkmattr_tlv_vals[] = {
1851   {BPKM_RESERVED,           "Reserved"},
1852   {BPKM_SERIAL_NUM,         "Serial Number"},
1853   {BPKM_MANUFACTURER_ID,    "Manufacturer ID"},
1854   {BPKM_MAC_ADDR,           "MAC Address"},
1855   {BPKM_RSA_PUB_KEY,        "RSA Public Key"},
1856   {BPKM_CM_ID,              "CM Identification"},
1857   {BPKM_DISPLAY_STR,        "Display String"},
1858   {BPKM_AUTH_KEY,           "Auth Key"},
1859   {BPKM_TEK,                "Traffic Encryption Key"},
1860   {BPKM_KEY_LIFETIME,       "Key Lifetime"},
1861   {BPKM_KEY_SEQ_NUM,        "Key Sequence Number"},
1862   {BPKM_HMAC_DIGEST,        "HMAC Digest"},
1863   {BPKM_SAID,               "SAID"},
1864   {BPKM_TEK_PARAM,          "TEK Parameters"},
1865   {BPKM_OBSOLETED,          "Obsoleted"},
1866   {BPKM_CBC_IV,             "CBC IV"},
1867   {BPKM_ERROR_CODE,         "Error Code"},
1868   {BPKM_CA_CERT,            "CA Certificate"},
1869   {BPKM_CM_CERT,            "CM Certificate"},
1870   {BPKM_SEC_CAPABILITIES,   "Security Capabilities"},
1871   {BPKM_CRYPTO_SUITE,       "Cryptographic Suite"},
1872   {BPKM_CRYPTO_SUITE_LIST,  "Cryptographic Suite List"},
1873   {BPKM_BPI_VERSION,        "BPI Version"},
1874   {BPKM_SA_DESCRIPTOR,      "SA Descriptor"},
1875   {BPKM_SA_TYPE,            "SA Type"},
1876   {BPKM_SA_QUERY,           "SA Query"},
1877   {BPKM_SA_QUERY_TYPE,      "SA Query Type"},
1878   {BPKM_IP_ADDRESS,         "IP Address"},
1879   {BPKM_DNLD_PARAMS,        "Download Parameters"},
1880   {BPKM_VENDOR_DEFINED,     "Vendor Defined"},
1881   {0, NULL}
1882 };
1883 
1884 static const value_string error_code_vals[] = {
1885   {0, "No Information"},
1886   {1, "Unauthorized CM"},
1887   {2, "Unauthorized SAID"},
1888   {3, "Unsolicited"},
1889   {4, "Invalid Key Sequence Number"},
1890   {5, "Message (Key Request) authentication failure"},
1891   {6, "Permanent Authorization Failure"},
1892   {7, "Not authorized for requested downstream traffic flow"},
1893   {8, "Downstream traffic flow not mapped to SAID"},
1894   {9, "Time of day not acquired"},
1895   {10, "EAE Disabled"},
1896   {0, NULL},
1897 };
1898 
1899 static const value_string crypto_suite_attr_vals[] = {
1900   {0x0100, "CBC-Mode 56-bit DES, no data authentication"},
1901   {0x0200, "CBC-Mode 40-bit DES, no data authentication"},
1902   {0x0300, "CBC-Mode 128-bit AES, no data authentication"},
1903   {0, NULL},
1904 };
1905 
1906 static const value_string bpi_ver_vals[] = {
1907   {0, "Reserved"},
1908   {1, "BPI+"},
1909   {0, NULL},
1910 };
1911 
1912 static const value_string mdd_tlv_vals[] = {
1913   {DOWNSTREAM_ACTIVE_CHANNEL_LIST,                       "Downstream Active Channel List"},
1914   {MAC_DOMAIN_DOWNSTREAM_SERVICE_GROUP,                  "MAC Domain Downstream Service Group"},
1915   {DOWNSTREAM_AMBIGUITY_RESOLUTION_FREQUENCY_LIST,       "Downstream Ambiguity Resolution Frequency List "},
1916   {RECEIVE_CHANNEL_PROFILE_REPORTING_CONTROL ,           "Receive Channel Profile Reporting Control"},
1917   {IP_INITIALIZATION_PARAMETERS ,                        "IP Initialization Parameters"},
1918   {EARLY_AUTHENTICATION_AND_ENCRYPTION ,                 "Early Authentication and Encryption"},
1919   {UPSTREAM_ACTIVE_CHANNEL_LIST ,                        "Upstream Active Channel List"},
1920   {UPSTREAM_AMBIGUITY_RESOLUTION_CHANNEL_LIST ,          "Upstream Ambiguity Resolution Channel List"},
1921   {UPSTREAM_FREQUENCY_RANGE  ,                           "Upstream Frequency Range"},
1922   {SYMBOL_CLOCK_LOCKING_INDICATOR  ,                     "Symbol Clock Locking Indicator"},
1923   {CM_STATUS_EVENT_CONTROL  ,                            "CM-STATUS Event Control"},
1924   {UPSTREAM_TRANSMIT_POWER_REPORTING  ,                  "Upstream Transmit Power Reporting"},
1925   {DSG_DA_TO_DSID_ASSOCIATION_ENTRY  ,                   "DSG DA-to-DSID Association Entry"},
1926   {CM_STATUS_EVENT_ENABLE_NON_CHANNEL_SPECIFIC_EVENTS  , "CM-STATUS Event Enable for Non-Channel-Specific-Events"},
1927   {EXTENDED_UPSTREAM_TRANSMIT_POWER_SUPPORT  ,           "Extended Upstream Transmit Power Support"},
1928   {CMTS_DOCSIS_VERSION  ,                                "CMTS DOCSIS Version"},
1929   {CM_PERIODIC_MAINTENANCE_TIMEOUT_INDICATOR  ,          "CM Periodic Maintenance Timeout Indicator"},
1930   {DLS_BROADCAST_AND_MULTICAST_DELIVERY_METHOD  ,        "DLS Broadcast and Multicast Delivery Method"},
1931   {CM_STATUS_EVENT_ENABLE_FOR_DOCSIS_3_1_EVENTS  ,       "CM-STATUS Event Enable for DOCSIS 3.1 Specific Events"},
1932   {DIPLEXER_BAND_EDGE  ,                                 "Diplexer Band Edge"},
1933   {FULL_DUPLEX_DESCRIPTOR  ,                             "Full Duplex Descriptor"},
1934   {0, NULL}
1935 };
1936 
1937 
1938 static const value_string rcp_center_frequency_spacing_vals[] = {
1939   {ASSUME_6MHZ_CENTER_FREQUENCY_SPACING  , "CM MUST report only Receive Channel Profiles assuming 6 MHz center frequency spacing"},
1940   {ASSUME_8MHZ_CENTER_FREQUENCY_SPACING  , "CM MUST report only Receive Channel Profiles assuming 8 MHz center frequency spacing"},
1941   {0, NULL}
1942 };
1943 
1944 static const value_string verbose_rcp_reporting_vals[] = {
1945   {RCP_NO_VERBOSE_REPORTING  , "CM MUST NOT provide verbose reporting of all its Receive Channel Profile(s) (both standard profiles and manufacturers profiles)."},
1946   {RCP_VERBOSE_REPORTING  ,    "CM MUST provide verbose reporting of Receive Channel Profile(s) (both standard profiles and manufacturers profiles)."},
1947   {0, NULL}
1948 };
1949 
1950 static const value_string fragmented_rcp_transmission_vals[] = {
1951   {1, "CM optionally transmits Receive Channel Profile (s) requiring fragmentation (RCPs in excess of 255 bytes) in addition to those that do not."},
1952   {0, NULL}
1953 };
1954 
1955 static const value_string ip_provisioning_mode_vals[] = {
1956   {IPv4_ONLY  ,  "IPv4 Only"},
1957   {IPv6_ONLY ,   "IPv6 Only"},
1958   {IP_ALTERNATE, "Alternate"},
1959   {DUAL_STACK ,  "Dual Stack"},
1960   {0, NULL}
1961 };
1962 
1963 static const value_string eae_vals[] = {
1964   {EAE_DISABLED  , "early authentication and encryption disabled"},
1965   {EAE_ENABLED ,   "early authentication and encryption enabled"},
1966   {0, NULL}
1967 };
1968 
1969 static const value_string upstream_frequency_range_vals[] = {
1970   {STANDARD_UPSTREAM_FREQUENCY_RANGE, "Standard Upstream Frequency Range"},
1971   {EXTENDED_UPSTREAM_FREQUENCY_RANGE, "Extended Upstream Frequency Range"},
1972   {0, NULL}
1973 };
1974 
1975 static const value_string symbol_clock_locking_indicator_vals[] = {
1976   {NOT_LOCKED_TO_MASTER_CLOCK, "Symbol Clock is not locked to Master Clock"},
1977   {LOCKED_TO_MASTER_CLOCK,     "Symbol Clock is locked to Master Clock"},
1978   {0, NULL}
1979 };
1980 
1981 static const value_string symbol_cm_status_event_vals[] = {
1982   {SECONDARY_CHANNEL_MDD_TIMEOUT,               "Secondary Channel MDD timeout"},
1983   {QAM_FEC_LOCK_FAILURE,                        "Qam FEC Lock Failure"},
1984   {SEQUENCE_OUT_OF_RANGE,                       "Sequence out of Range"},
1985   {MDD_RECOVERY,                                "MDD Recovery"},
1986   {QAM_FEC_LOCK_RECOVERY,                       "Qam FEC Lock Recovery"},
1987   {T4_TIMEOUT,                                  "T4 Timeout"},
1988   {T3_RETRIES_EXCEEDED,                         "T3 Retries Exceeded"},
1989   {SUCCESFUL_RANGING_AFTER_T3_RETRIES_EXCEEDED, "Successful ranging after T3 Retries Exceeded"},
1990   {CM_OPERATING_ON_BATTERY_BACKUP,              "CM Operating on Battery Backup"},
1991   {CM_RETURNED_TO_AC_POWER,                     "CM Returned to AC Power"},
1992   {0, NULL}
1993 };
1994 
1995 static const value_string upstream_transmit_power_reporting_vals[] = {
1996   {CM_DOESNT_REPORT_TRANSMIT_POWER, "CM does not report transmit power in RNG-REQ, INIT-RNG-REQ, and B-INIT-RNG-REQ messages"},
1997   {CM_REPORTS_TRANSMIT_POWER,       "CM reports transmit power in RNG-REQ, INIT-RNG-REQ, and B-INIT-RNG-REQ messages"},
1998   {0, NULL}
1999 };
2000 
2001 static const value_string cm_periodic_maintenance_timeout_indicator_vals[] = {
2002   {0, "use Unicast Ranging opportunity"},
2003   {1, "use Probe opportunity"},
2004   {2, "use Unicast Ranging or Probe opportunity"},
2005   {0, NULL}
2006 };
2007 
2008 static const value_string dls_broadcast_and_multicast_delivery_method_vals[] = {
2009   {1, "delayed selected multicast method"},
2010   {2, "selectively replicated multicast method"},
2011   {0, NULL}
2012 };
2013 
2014 
2015 static const value_string mdd_ds_active_channel_list_vals[] = {
2016   {DOWNSTREAM_ACTIVE_CHANNEL_LIST_CHANNEL_ID, "Channel ID"},
2017   {DOWNSTREAM_ACTIVE_CHANNEL_LIST_FREQUENCY, "Frequency"},
2018   {DOWNSTREAM_ACTIVE_CHANNEL_LIST_MODULATION_ORDER_ANNEX, "Annex/Modulation Order"},
2019   {DOWNSTREAM_ACTIVE_CHANNEL_LIST_PRIMARY_CAPABLE, "Primary Capable"},
2020   {DOWNSTREAM_ACTIVE_CHANNEL_LIST_CM_STATUS_EVENT_ENABLE_BITMASK, "CM-STATUS Event Enable Bitmask"},
2021   {DOWNSTREAM_ACTIVE_CHANNEL_LIST_MAP_UCD_TRANSPORT_INDICATOR, "MAP and UCD transport indicator"},
2022   {DOWNSTREAM_ACTIVE_CHANNEL_LIST_OFDM_PLC_PARAMETERS, "OFDM PLC Parameters"},
2023   {DOWNSTREAM_ACTIVE_CHANNEL_LIST_FDX_SUB_BAND_ID, "Full Duplex Sub-band ID"},
2024   {0, NULL}
2025 };
2026 
2027 static const value_string mdd_ds_service_group_vals[] = {
2028   {MAC_DOMAIN_DOWNSTREAM_SERVICE_GROUP_MD_DS_SG_IDENTIFIER, "MD-DS-SG Identifier"},
2029   {MAC_DOMAIN_DOWNSTREAM_SERVICE_GROUP_CHANNEL_IDS,       "Channel Ids"},
2030   {0, NULL}
2031 };
2032 
2033 static const value_string mdd_channel_profile_reporting_control_vals[] = {
2034   {RCP_CENTER_FREQUENCY_SPACING, "RCP Center Frequency Spacing"},
2035   {VERBOSE_RCP_REPORTING,       "Verbose RCP reporting"},
2036   {FRAGMENTED_RCP_TRANSMISSION, "Fragmented RCP transmission"},
2037   {0, NULL}
2038 };
2039 
2040 static const value_string mdd_ip_init_param_vals[] = {
2041   {IP_PROVISIONING_MODE, "IP Provisioning Mode"},
2042   {PRE_REGISTRATION_DSID, "Pre-registration DSID"},
2043   {0, NULL}
2044 };
2045 
2046 static const value_string mdd_up_active_channel_list_vals[] = {
2047   {UPSTREAM_ACTIVE_CHANNEL_LIST_UPSTREAM_CHANNEL_ID, "Upstream Channel ID"},
2048   {UPSTREAM_ACTIVE_CHANNEL_LIST_CM_STATUS_EVENT_ENABLE_BITMASK, "CM-STATUS Event Enable Bitmask"},
2049   {UPSTREAM_ACTIVE_CHANNEL_LIST_UPSTREAM_CHANNEL_PRIORITY, "Upstream Channel Priority"},
2050   {UPSTREAM_ACTIVE_CHANNEL_LIST_DSCHIDS_MAPS_UCDS, "Downstream Channel(s) on which MAPs and UCDs for this Upstream Channel are sent"},
2051   {UPSTREAM_ACTIVE_CHANNEL_LIST_FDX_UPSTREAM_CHANNEL, "FDX Upstream Channel"},
2052   {UPSTREAM_ACTIVE_CHANNEL_LIST_FDX_SUBBAND_ID, "FDX Sub-band ID"},
2053   {0, NULL}
2054 };
2055 
2056 static const value_string mdd_cm_status_event_control_vals[] = {
2057   {EVENT_TYPE_CODE, "Event Type"},
2058   {MAXIMUM_EVENT_HOLDOFF_TIMER,    "Maximum Event Holdoff Timer"},
2059   {MAXIMUM_NUMBER_OF_REPORTS_PER_EVENT,    "Maximum Number of Reports per Event"},
2060   {0, NULL}
2061 };
2062 
2063 static const value_string mdd_cm_dsg_da_to_dsid_vals[] = {
2064   {DSG_DA_TO_DSID_ASSOCIATION_DA, "Destination Address"},
2065   {DSG_DA_TO_DSID_ASSOCIATION_DSID, "DSID"},
2066   {0, NULL}
2067 };
2068 
2069 static const value_string tlv20_vals[] = {
2070   {0, "Selectable active codes mode 1 enabled and code hopping disabled"},
2071   {1, "Selectable active codes mode 1 enabled and code hopping mode 1 enabled"},
2072   {2, "Selectable active codes mode 2 enabled and code hopping mode 2 enabled"},
2073   {3, "Selectable active codes mode 2 enabled and code hopping disabled"},
2074   {0, NULL}
2075 };
2076 
2077 static const value_string mdd_diplexer_band_edge_vals[] = {
2078   {DIPLEXER_US_UPPER_BAND_EDGE, "Diplexer Upstream Upper Band Edge"},
2079   {DIPLEXER_DS_LOWER_BAND_EDGE, "Diplexer Downstream Lower Band Edge"},
2080   {DIPLEXER_DS_UPPER_BAND_EDGE, "Diplexer Downstream Upper Band Edge"},
2081   {0, NULL}
2082 };
2083 
2084 static const value_string mdd_diplexer_us_upper_band_edge_vals[] = {
2085   {0, "Upstream Frequency Range up to 42 MHz"},
2086   {1, "Upstream Frequency Range up to 65 MHz"},
2087   {2, "Upstream Frequency Range up to 85 MHz"},
2088   {3, "Upstream Frequency Range up to 117 MHz"},
2089   {4, "Upstream Frequency Range up to 204 MHz"},
2090   {0, NULL}
2091 };
2092 
2093 static const value_string mdd_diplexer_ds_lower_band_edge_vals[] = {
2094   {0, "Downstream Frequency Range starting from 108 MHz"},
2095   {1, "Downstream Frequency Range starting from 258 MHz"},
2096   {0, NULL}
2097 };
2098 
2099 static const value_string mdd_diplexer_ds_upper_band_edge_vals[] = {
2100   {0, "Downstream Frequency Range up to 1218 MHz"},
2101   {1, "Downstream Frequency Range up to 1794 MHz"},
2102   {2, "Downstream Frequency Range up to 1002 MHz"},
2103   {0, NULL}
2104 };
2105 
2106 static const value_string mdd_full_duplex_descriptor_vals[] = {
2107   {FDX_ALLOCATED_SPECTRUM, "Full Duplex Allocated Spectrum"},
2108   {FDX_TOTAL_NUMBER_OF_SUB_BANDS, "Total number of sub-bands"},
2109   {FDX_SUB_BAND_WIDTH, "Full Duplex Sub-band Width"},
2110   {FDX_SUB_BAND_DESCRIPTOR, "Full Duplex Sub-band Descriptor"},
2111   {0, NULL}
2112 };
2113 
2114 static const value_string mdd_full_duplex_allocated_spectrum_vals[] = {
2115   {0, "96 MHz"},
2116   {1, "192 MHz"},
2117   {2, "288 MHz"},
2118   {3, "384 MHz"},
2119   {4, "576 MHz"},
2120   {0, NULL}
2121 };
2122 
2123 static const value_string mdd_full_duplex_sub_band_width_vals[] = {
2124   {0, "96 MHz"},
2125   {1, "192 MHz"},
2126   {0, NULL}
2127 };
2128 
2129 static const value_string mdd_full_duplex_sub_band_vals[] = {
2130   {FDX_SUB_BAND_ID, "Full Duplex Sub-band ID"},
2131   {FDX_SUB_BAND_OFFSET, "Full Duplex Sub-band Offset"},
2132   {0, NULL}
2133 };
2134 
2135 static const value_string cmstatus_tlv_vals[] = {
2136   {STATUS_EVENT, "Status Event"},
2137   {0, NULL}
2138 };
2139 
2140 static const value_string cmstatus_status_event_tlv_vals[] = {
2141   {EVENT_DS_CH_ID, "Downstream Channel ID"},
2142   {EVENT_US_CH_ID, "Upstream Channel ID"},
2143   {EVENT_DSID, "DSID"},
2144   {EVENT_DESCR, "Description"},
2145   {EVENT_MAC_ADDRESS, "MAC Address"},
2146   {EVENT_DS_OFDM_PROFILE_ID, "Downstream OFDM Profile ID"},
2147   {EVENT_US_OFDMA_PROFILE_ID, "Upstream OFDMA Profile ID"},
2148   {0, NULL}
2149 };
2150 
2151 static const value_string cmctrlreq_tlv_vals[] = {
2152   {CM_CTRL_MUTE, "Upstream Channel RF Mute"},
2153   {CM_CTRL_MUTE_TIMEOUT, "RF Mute Timeout Interval"},
2154   {CM_CTRL_REINIT, "CM Reinitialize"},
2155   {CM_CTRL_DISABLE_FWD, "Disable Forwarding"},
2156   {CM_CTRL_DS_EVENT, "Override Downstream Events"},
2157   {CM_CTRL_US_EVENT, "Override Upstream Events"},
2158   {CM_CTRL_EVENT, "Override Non-Channel-Specific Events"},
2159   {0, NULL}
2160 };
2161 
2162 static const value_string cmctrlreq_us_tlv_vals[] = {
2163   {US_EVENT_CH_ID, "Upstream Channel ID"},
2164   {US_EVENT_MASK, "Upstream Status Event Enable Bitmask"},
2165   {0, NULL}
2166 };
2167 
2168 static const value_string cmctrlreq_ds_tlv_vals[] = {
2169   {DS_EVENT_CH_ID, "Downstream Channel ID"},
2170   {DS_EVENT_MASK,  "Downstream Status Event Enable Bitmask"},
2171   {0, NULL}
2172 };
2173 
2174 static const value_string emrsp_tlv_vals[] = {
2175   {EM_HOLDOFF_TIMER, "Hold-Off Timer"},
2176   {0, NULL}
2177 };
2178 
2179 static const value_string emreq_req_power_mode_vals[] = {
2180   {0, "Normal Operation"},
2181   {1, "Energy Management 1x1 Mode"},
2182   {2, "DOCSIS Light Sleep Mode"},
2183   {0, NULL}
2184 };
2185 
2186 static const value_string emrsp_rsp_code_vals[] = {
2187   {0, "OK"},
2188   {1, "Reject Temporary"},
2189   {2, "Reject Permanent, Requested Low Power Mode(s) Not Supported"},
2190   {3, "Reject Permanent, Requested Low Power Mode(s) Disabled"},
2191   {4, "Reject Permanent, Other"},
2192   {0, NULL}
2193 };
2194 
2195 static const value_string docsis_ocd_subc_assign_type_str[] = {
2196   {0, "range, continuous"},
2197   {1, "range, skip by 1"},
2198   {2, "list"},
2199   {3, "reserved"},
2200   {0, NULL}
2201 };
2202 
2203 static const value_string docsis_ocd_subc_assign_value_str[] = {
2204   {0, "specific value"},
2205   {1, "default value"},
2206   {0, NULL}
2207 };
2208 
2209 static const value_string docsis_ocd_subc_assign_subc_type_str[] = {
2210   {1, "continuous pilot"},
2211   {16, "excluded subcarriers"},
2212   {20, "PLC, 16-QAM"},
2213   {0, NULL}
2214 };
2215 
2216 static const value_string docsis_ocd_four_trans_size[] = {
2217   {0, "4096 subcarriers at 50 kHz spacing"},
2218   {1, "8192 subcarriers at 25 kHz spacing"},
2219   {0, NULL}
2220 };
2221 
2222 static const value_string docsis_ocd_cyc_prefix[] = {
2223   {0, "0.9375 "UTF8_MICRO_SIGN"s with 192 samples"},
2224   {1, "1.25 "UTF8_MICRO_SIGN"s with 256 samples"},
2225   {2, "2.5 "UTF8_MICRO_SIGN"s with 512 samples"},
2226   {3, "3.75 "UTF8_MICRO_SIGN"s with 768 samples"},
2227   {4, "5.0 "UTF8_MICRO_SIGN"s with 1024 samples"},
2228   {0, NULL}
2229 };
2230 
2231 static const value_string docsis_ocd_roll_off[] = {
2232   {0, "0 "UTF8_MICRO_SIGN"s with 0 samples"},
2233   {1, "0.3125 "UTF8_MICRO_SIGN"s with 64 samples"},
2234   {2, "0.625 "UTF8_MICRO_SIGN"s with 128 samples"},
2235   {3, "0.9375 "UTF8_MICRO_SIGN"s with 192 samples"},
2236   {4, "1.25 "UTF8_MICRO_SIGN"s with 256 samples"},
2237   {0, NULL}
2238 };
2239 
2240 static const value_string docsis_ocd_prim_cap_ind_str[] = {
2241   {0, "channel is not primary capable"},
2242   {1, "channel is primary capable"},
2243   {0, NULL}
2244 };
2245 
2246 static const value_string ocd_tlv_vals[] = {
2247   {DISCRETE_FOURIER_TRANSFORM_SIZE, "Discrete Fourier Transform Size"},
2248   {CYCLIC_PREFIX, "Cyclic Prefix"},
2249   {ROLL_OFF, "Roll Off"},
2250   {OFDM_SPECTRUM_LOCATION, "OFDM Spectrum Location"},
2251   {TIME_INTERLEAVING_DEPTH, "Time Interleaving Depth"},
2252   {SUBCARRIER_ASSIGNMENT_RANGE_LIST, "Subcarrier Assignment Range/List"},
2253   {PRIMARY_CAPABILITY_INDICATOR, "Primary Capable Indicator"},
2254   {0, NULL}
2255 };
2256 
2257 static const value_string docsis_dpd_subc_assign_type_str[] = {
2258   {0, "range, continuous"},
2259   {1, "range, skip by 1"},
2260   {2, "list"},
2261   {3, "reserved"},
2262   {0, NULL}
2263 };
2264 
2265 static const value_string docsis_dpd_subc_assign_value_str[] = {
2266   {0, "specific value"},
2267   {1, "default value"},
2268   {0, NULL}
2269 };
2270 
2271 static const value_string docsis_dpd_subc_assign_modulation_str[] = {
2272   {0, "zero-bit loaded"},
2273   {1, "reserved"},
2274   {2, "QPSK (for NCP profile only)"},
2275   {3, "reserved"},
2276   {4, "16-QAM"},
2277   {5, "reserved"},
2278   {6, "64-QAM"},
2279   {7, "128-QAM"},
2280   {8, "256-QAM"},
2281   {9, "512-QAM"},
2282   {10, "1024-QAM"},
2283   {11, "2048-QAM"},
2284   {12, "4096-QAM"},
2285   {13, "8192-QAM"},
2286   {14, "16384-QAM"},
2287   {15, "reserved"},
2288   {0, NULL}
2289 };
2290 
2291 static const value_string docsis_dpd_tlv_subc_assign_vector_oddness_str[] = {
2292   {0, "N is even"},
2293   {1, "N is odd"},
2294   {0, NULL}
2295 };
2296 
2297 static const value_string docsis_dpd_tlv_subc_assign_vector_modulation_str[] = {
2298   {0, "zero-bit loaded"},
2299   {1, "continuous pilot"},
2300   {2, "QPSK (for NCP profile only)"},
2301   {3, "reserved"},
2302   {4, "16-QAM"},
2303   {5, "reserved"},
2304   {6, "64-QAM"},
2305   {7, "128-QAM"},
2306   {8, "256-QAM"},
2307   {9, "512-QAM"},
2308   {10, "1024-QAM"},
2309   {11, "2048-QAM"},
2310   {12, "4096-QAM"},
2311   {13, "8192-QAM"},
2312   {14, "16384-QAM"},
2313   {15, "reserved"},
2314   {0, NULL}
2315 };
2316 
2317 static const value_string dpd_tlv_vals[] = {
2318   {SUBCARRIER_ASSIGNMENT_RANGE_LIST, "Subcarrier Assignment Range/List"},
2319   {SUBCARRIER_ASSIGNMENT_VECTOR, "Subcarrier Assignment Vector"},
2320   {0, NULL}
2321 };
2322 
2323 static const value_string ofdma_cyclic_prefix_size_vals[] = {
2324   {1, "96 samples"},
2325   {2, "128 samples"},
2326   {3, "160 samples"},
2327   {4, "192 samples"},
2328   {5, "224 samples"},
2329   {6, "256 samples"},
2330   {7, "288 samples"},
2331   {8, "320 samples"},
2332   {9, "384 samples"},
2333   {10, "512 samples"},
2334   {11, "640 samples"},
2335   {0, NULL}
2336 };
2337 
2338 static const value_string ofdma_rolloff_period_size_vals[] = {
2339   {1, "0 samples"},
2340   {2, "32 samples"},
2341   {3, "64 samples"},
2342   {4, "96 samples"},
2343   {5, "128 samples"},
2344   {6, "160 samples"},
2345   {7, "192 samples"},
2346   {8, "224 samples"},
2347   {0, NULL}
2348 };
2349 
2350 static const value_string subc_spacing_vals[] = {
2351   {1, "25 kHz (corresponds to 4096 subcarriers and 16 subcarriers per minislot)"},
2352   {2, "50 kHz (corresponds to 2048 subcarriers and 8 subcarriers per minislot)"},
2353   {0, NULL}
2354 };
2355 
2356 static const value_string ofdma_prof_mod_order[] = {
2357   {0, "no bit-loading"},
2358   {1, "BPSK"},
2359   {2, "QPSK"},
2360   {3, "8-QAM"},
2361   {4, "16-QAM"},
2362   {5, "32-QAM"},
2363   {6, "64-QAM"},
2364   {7, "128-QAM"},
2365   {8, "256-QAM"},
2366   {9, "512-QAM"},
2367   {10, "1024-QAM"},
2368   {11, "2048-QAM"},
2369   {12, "4096-QAM"},
2370   {0, NULL}
2371 };
2372 
2373 static const value_string profile_id_vals[] = {
2374   {0, "Profile A"},
2375   {1, "Profile B"},
2376   {2, "Profile C"},
2377   {3, "Profile D"},
2378   {4, "Profile E"},
2379   {5, "Profile F"},
2380   {6, "Profile G"},
2381   {7, "Profile H"},
2382   {8, "Profile I"},
2383   {9, "Profile J"},
2384   {10, "Profile K"},
2385   {11, "Profile L"},
2386   {12, "Profile M"},
2387   {13, "Profile N"},
2388   {14, "Profile O"},
2389   {15, "Profile P"},
2390   {254, "Profile for RxMER statistics only"},
2391   {255, "NCP Profile"},
2392   {0, NULL}
2393 };
2394 
2395 static const value_string opt_opcode_vals[] = {
2396   {1, "Start"},
2397   {2, "Abort"},
2398   {0, NULL}
2399 };
2400 
2401 static const value_string opt_status_vals[] = {
2402   {1, "Testing"},
2403   {2, "Profile already testing from another request"},
2404   {3, "No free profile resource on CM"},
2405   {4, "Maximum duration expired"},
2406   {5, "Aborted"},
2407   {6, "Complete"},
2408   {7, "Profile already assigned to the CM"},
2409   {0, NULL}
2410 };
2411 
2412 static const value_string optreq_tlv_vals[] = {
2413   {OPT_REQ_REQ_STAT, "Requested Statistics"},
2414   {OPT_REQ_RXMER_THRESH_PARAMS, "RxMER Thresholding Parameters"},
2415   {0, NULL}
2416 };
2417 
2418 static const value_string optreq_tlv_rxmer_thresh_params_vals[] = {
2419   {OPT_REQ_RXMER_THRESH_PARAMS_MODULATION_ORDER, "Modulation Order"},
2420   {0, NULL}
2421 };
2422 
2423 static const value_string opreq_tlv_rxmer_thresh_params_mod_order[] = {
2424   {0, "reserved"},
2425   {1, "reserved"},
2426   {2, "QPSK"},
2427   {3, "reserved"},
2428   {4, "16-QAM"},
2429   {5, "reserved"},
2430   {6, "64-QAM"},
2431   {7, "128-QAM"},
2432   {8, "256-QAM"},
2433   {9, "512-QAM"},
2434   {10, "1024-QAM"},
2435   {11, "2048-QAM"},
2436   {12, "4096-QAM"},
2437   {13, "8192-QAM"},
2438   {14, "16384-QAM"},
2439   {15, "reserved"},
2440   {0, NULL}
2441 };
2442 
2443 static const value_string optrsp_tlv_vals [] = {
2444   {OPT_RSP_RXMER_AND_SNR_MARGIN_DATA, "RxMER and SNR Margin Data"},
2445   {0, NULL}
2446 };
2447 
2448 static const value_string optrsp_tlv_rxmer_snr_margin_vals [] = {
2449   {OPT_RSP_RXMER_PER_SUBCARRIER, "RxMER per Subcarrier"},
2450   {0, NULL}
2451 };
2452 
2453 static const value_string sid_field_bit15_14_vals [] = {
2454   {0, "No error condition"},
2455   {1, "Power Adjustment not applied"},
2456   {2, "The current value for Pr is more than 3dB below the top of the dynamic range window for all channels"},
2457   {3, "Maximum Scheduled Codes Unnecessary"},
2458   {0, NULL}
2459 };
2460 
2461 static const value_string rba_subband_direction_vals [] = {
2462   {0, "Direction of this sub-band is downstream"},
2463   {1, "Direction of this sub-band is upstream"},
2464   {2, "Direction of this sub-band is undefined for this RBA"},
2465   {0, NULL}
2466 };
2467 
2468 
2469 static const true_false_string tfs_ucd_change_ind_vals = {"Changes", "No changes"};
2470 
2471 static const true_false_string tfs_allow_inhibit = { "Inhibit Initial Ranging", "Ranging Allowed" };
2472 static const true_false_string type35ucd_tfs_present_not_present = { "UCD35 is present for this UCID",
2473                                                                      "UCD35 is not present for this UCID" };
2474 
2475 static const true_false_string sid_field_bit15_tfs = {
2476   "The commanded power level P1.6r_n is higher than the value corresponding to the top of the DRW.",
2477   "The commanded power level P1.6r_n is not higher than the value corresponding to the top of the DRW."
2478 };
2479 
2480 static const true_false_string sid_field_bit14_tfs = {
2481   "The commanded power level P1.6r_n is in excess of 6 dB below the value corresponding to the top of the DRW.",
2482   "The commanded power level P1.6r_n is not in excess of 6 dB below the value corresponding to the top of the DRW."
2483 };
2484 
2485 static const value_string unique_unlimited[] = {
2486   { 0, "Unlimited" },
2487   {0, NULL}
2488 };
2489 
2490 static const unit_name_string local_units_hz = { "Hz", NULL };
2491 
2492 static void
2493 ofdma_ir_pow_ctrl_start_pow(char *buf, guint32 value)
2494 {
2495     g_snprintf(buf, ITEM_LABEL_LENGTH, "%f dBmV/1.6MHz", value/4.0);
2496 }
2497 
2498 static void
2499 ofdma_ir_pow_ctrl_step_size(char *buf, guint32 value)
2500 {
2501     g_snprintf(buf, ITEM_LABEL_LENGTH, "%f dB", value/4.0);
2502 }
2503 
2504 static void
2505 fourth_db(char *buf, guint32 value)
2506 {
2507     g_snprintf(buf, ITEM_LABEL_LENGTH, "%f dB", value/4.0);
2508 }
2509 
2510 static void
2511 subc_assign_range(char *buf, guint32 value)
2512 {
2513     g_snprintf(buf, ITEM_LABEL_LENGTH, "%u - %u", value >> 16, value &0xFFFF);
2514 }
2515 
2516 static void
2517 multipart_number_of_fragments(char *buf, guint32 value)
2518 {
2519     g_snprintf(buf, ITEM_LABEL_LENGTH, "%u (Actual Number of Fragments: %u)", value, value + 1);
2520 }
2521 
2522 static reassembly_table docsis_tlv_reassembly_table;
2523 static reassembly_table docsis_opt_tlv_reassembly_table;
2524 static reassembly_table docsis_rngrsp_tlv_reassembly_table;
2525 
2526 static const fragment_items docsis_tlv_frag_items = {
2527   &ett_docsis_tlv_fragment,
2528   &ett_docsis_tlv_fragments,
2529   &hf_docsis_tlv_fragments,
2530   &hf_docsis_tlv_fragment,
2531   &hf_docsis_tlv_fragment_overlap,
2532   &hf_docsis_tlv_fragment_overlap_conflict,
2533   &hf_docsis_tlv_fragment_multiple_tails,
2534   &hf_docsis_tlv_fragment_too_long_fragment,
2535   &hf_docsis_tlv_fragment_error,
2536   &hf_docsis_tlv_fragment_count,
2537   &hf_docsis_tlv_reassembled_in,
2538   &hf_docsis_tlv_reassembled_length,
2539   &hf_docsis_tlv_reassembled_data,
2540   "TLV fragments"
2541 };
2542 
2543 
2544 static int
2545 dissect_sync (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
2546 {
2547   proto_item *it;
2548   proto_tree *sync_tree;
2549 
2550   col_set_str(pinfo->cinfo, COL_INFO, "Sync Message");
2551 
2552   it = proto_tree_add_item(tree, proto_docsis_sync, tvb, 0, -1, ENC_NA);
2553   sync_tree = proto_item_add_subtree (it, ett_docsis_sync);
2554 
2555   proto_tree_add_item (sync_tree, hf_docsis_sync_cmts_timestamp, tvb, 0, 4, ENC_BIG_ENDIAN);
2556 
2557   return tvb_captured_length(tvb);
2558 }
2559 
2560 static void
2561 dissect_ucd_burst_descr(tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, proto_item * item, int pos, guint16 len)
2562 {
2563   int tlvpos, endtlvpos;
2564   guint8 tlvtype;
2565   guint32 i, tlvlen;
2566   proto_tree *burst_tree;
2567   proto_item *burst_item, *burst_len_item;
2568   guint iuc;
2569 
2570   tlvpos = pos;
2571   endtlvpos = tlvpos + len;
2572   proto_tree_add_item_ret_uint (tree, hf_docsis_ucd_iuc, tvb, tlvpos++, 1, ENC_BIG_ENDIAN, &iuc);
2573   proto_item_append_text(item, ": IUC %d (%s)", iuc, val_to_str(iuc,iuc_vals, "Unknown IUC"));
2574   while (tlvpos < endtlvpos)
2575   {
2576     tlvtype = tvb_get_guint8 (tvb, tlvpos);
2577     burst_tree = proto_tree_add_subtree (tree, tvb, tlvpos, -1,
2578                                                         ett_docsis_burst_tlv, &burst_item,
2579                                                         val_to_str(tlvtype, burst_tlv_vals,
2580                                                         "Unknown TLV (%u)"));
2581     proto_tree_add_uint (burst_tree, hf_docsis_ucd_burst_type, tvb, tlvpos++, 1, tlvtype);
2582     burst_len_item = proto_tree_add_item_ret_uint (burst_tree, hf_docsis_ucd_burst_length, tvb, tlvpos++, 1, ENC_NA, &tlvlen);
2583     proto_item_set_len(burst_item, tlvlen + 2);
2584     switch (tlvtype)
2585     {
2586     case UCD_MODULATION:
2587       if (tlvlen == 1)
2588       {
2589         proto_tree_add_item (burst_tree, hf_docsis_burst_mod_type, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2590       }
2591       else
2592       {
2593         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2594       }
2595       break;
2596     case UCD_DIFF_ENCODING:
2597       if (tlvlen == 1)
2598       {
2599         proto_tree_add_item (burst_tree, hf_docsis_burst_diff_encoding, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2600       }
2601       else
2602       {
2603         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2604       }
2605       break;
2606     case UCD_PREAMBLE_LEN:
2607       if (tlvlen == 2)
2608       {
2609         proto_tree_add_item (burst_tree, hf_docsis_burst_preamble_len, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2610       }
2611       else
2612       {
2613         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2614       }
2615       break;
2616     case UCD_PREAMBLE_VAL_OFF:
2617       if (tlvlen == 2)
2618       {
2619         proto_tree_add_item (burst_tree, hf_docsis_burst_preamble_val_off, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2620       }
2621       else
2622       {
2623         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2624       }
2625       break;
2626     case UCD_FEC:
2627       if (tlvlen == 1)
2628       {
2629         proto_tree_add_item (burst_tree, hf_docsis_burst_fec, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2630       }
2631       else
2632       {
2633         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2634       }
2635       break;
2636     case UCD_FEC_CODEWORD:
2637       if (tlvlen == 1)
2638       {
2639         proto_tree_add_item (burst_tree, hf_docsis_burst_fec_codeword, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2640       }
2641       else
2642       {
2643         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2644       }
2645       break;
2646     case UCD_SCRAMBLER_SEED:
2647       if (tlvlen == 2)
2648       {
2649         proto_tree_add_item (burst_tree, hf_docsis_burst_scrambler_seed, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2650       }
2651       else
2652       {
2653         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2654       }
2655       break;
2656     case UCD_MAX_BURST:
2657       if (tlvlen == 1)
2658       {
2659         proto_tree_add_item (burst_tree, hf_docsis_burst_max_burst, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2660       }
2661       else
2662       {
2663         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2664       }
2665       break;
2666     case UCD_GUARD_TIME:
2667       if (tlvlen == 1)
2668       {
2669         proto_tree_add_item (burst_tree, hf_docsis_burst_guard_time, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2670       }
2671       else
2672       {
2673         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2674       }
2675       break;
2676     case UCD_LAST_CW_LEN:
2677       if (tlvlen == 1)
2678       {
2679         proto_tree_add_item (burst_tree, hf_docsis_burst_last_cw_len, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2680       }
2681       else
2682       {
2683         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2684       }
2685       break;
2686     case UCD_SCRAMBLER_ONOFF:
2687       if (tlvlen == 1)
2688       {
2689         proto_tree_add_item (burst_tree, hf_docsis_burst_scrambler_onoff, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2690       }
2691       else
2692       {
2693         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2694       }
2695       break;
2696     case UCD_RS_INT_DEPTH:
2697       if (tlvlen == 1)
2698       {
2699         proto_tree_add_item (burst_tree, hf_docsis_rs_int_depth, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2700       }
2701       else
2702       {
2703         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2704       }
2705       break;
2706     case UCD_RS_INT_BLOCK:
2707       if (tlvlen == 2)
2708       {
2709         proto_tree_add_item (burst_tree, hf_docsis_rs_int_block, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2710       }
2711       else
2712       {
2713         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2714       }
2715       break;
2716     case UCD_PREAMBLE_TYPE:
2717       if (tlvlen == 1)
2718       {
2719         proto_tree_add_item (burst_tree, hf_docsis_preamble_type, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2720       }
2721       else
2722       {
2723         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2724       }
2725       break;
2726     case UCD_SCMDA_SCRAMBLER_ONOFF:
2727       if (tlvlen == 1)
2728       {
2729         proto_tree_add_item (burst_tree, hf_docsis_ucd_scdma_scrambler_onoff, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2730       }
2731       else
2732       {
2733         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2734       }
2735       break;
2736     case UCD_SCDMA_CODES_PER_SUBFRAME:
2737       if (tlvlen == 1)
2738       {
2739         proto_tree_add_item (burst_tree, hf_docsis_ucd_scdma_codes_per_subframe, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2740       }
2741       else
2742       {
2743         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2744       }
2745       break;
2746     case UCD_SCDMA_FRAMER_INT_STEP_SIZE:
2747       if (tlvlen == 1)
2748       {
2749         proto_tree_add_item (burst_tree, hf_docsis_ucd_scdma_framer_int_step_size, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2750       }
2751       else
2752       {
2753         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2754       }
2755       break;
2756     case UCD_TCM_ENABLED:
2757       if (tlvlen == 1)
2758       {
2759         proto_tree_add_item (burst_tree, hf_docsis_ucd_tcm_enabled, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2760       }
2761       else
2762       {
2763         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2764       }
2765       break;
2766     case UCD_SUBC_INIT_RANG:
2767       if (tlvlen == 2)
2768       {
2769         proto_tree_add_item (burst_tree, hf_docsis_subc_init_rang, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2770       }
2771       else
2772       {
2773         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2774       }
2775       break;
2776     case UCD_SUBC_FINE_RANG:
2777       if (tlvlen == 2)
2778       {
2779         proto_tree_add_item (burst_tree, hf_docsis_subc_fine_rang, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2780       }
2781       else
2782       {
2783         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2784       }
2785       break;
2786     case UCD_OFDMA_PROFILE:
2787       if ((tlvlen % 2) == 0)
2788       {
2789         for(i =0; i < tlvlen; i+=2) {
2790           proto_tree_add_item (burst_tree, hf_docsis_ofdma_prof_mod_order, tvb, tlvpos + i, 1, ENC_BIG_ENDIAN);
2791           proto_tree_add_item (burst_tree, hf_docsis_ofdma_prof_pilot_pattern, tvb, tlvpos + i, 1, ENC_BIG_ENDIAN);
2792           proto_tree_add_item (burst_tree, hf_docsis_ofdma_prof_num_add_minislots, tvb, tlvpos + i + 1, 1, ENC_BIG_ENDIAN);
2793         }
2794       }
2795       else
2796       {
2797         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u (even length expected)", tlvlen);
2798       }
2799       break;
2800     case UCD_OFDMA_IR_POWER_CONTROL:
2801       if (tlvlen == 2)
2802       {
2803         proto_tree_add_item (burst_tree, hf_docsis_ofdma_ir_pow_ctrl_start_pow, tvb, tlvpos, tlvlen, ENC_BIG_ENDIAN);
2804         proto_tree_add_item (burst_tree, hf_docsis_ofdma_ir_pow_ctrl_step_size, tvb, tlvpos + 1, tlvlen, ENC_BIG_ENDIAN);
2805       }
2806       else
2807       {
2808         expert_add_info_format(pinfo, burst_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
2809       }
2810       break;
2811 
2812     } /* switch(tlvtype) */
2813 
2814   tlvpos += tlvlen;
2815   } /* while (tlvpos < endtlvpos) */
2816 
2817 }
2818 
2819 static int
2820 dissect_any_ucd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, int proto_id, int type_number)
2821 {
2822   int pos;
2823   guint32 i, upchid, length;
2824   guint8 type, symrate;
2825   proto_tree *ucd_tree, *tlv_tree;
2826   proto_item *ucd_item, *tlv_item, *tlv_len_item;
2827 
2828   ucd_item = proto_tree_add_item(tree, proto_id, tvb, 0, -1, ENC_NA);
2829   ucd_tree = proto_item_add_subtree (ucd_item, ett_docsis_ucd);
2830   proto_tree_add_item_ret_uint (ucd_tree, hf_docsis_mgt_upstream_chid, tvb, 0, 1, ENC_BIG_ENDIAN, &upchid);
2831   proto_tree_add_item (ucd_tree, hf_docsis_ucd_config_ch_cnt, tvb, 1, 1, ENC_BIG_ENDIAN);
2832   proto_tree_add_item (ucd_tree, hf_docsis_ucd_mini_slot_size, tvb, 2, 1, ENC_BIG_ENDIAN);
2833   proto_tree_add_item (ucd_tree, hf_docsis_mgt_down_chid, tvb, 3, 1, ENC_BIG_ENDIAN);
2834 
2835   /* if the upstream Channel ID is 0 then this is for Telephony Return) */
2836   if (upchid > 0)
2837     col_add_fstr (pinfo->cinfo, COL_INFO,
2838                   "Type %d UCD Message: Channel ID = %u (U%u)", type_number, upchid,
2839                   upchid - 1);
2840   else
2841     col_add_fstr (pinfo->cinfo, COL_INFO,
2842                   "Type %d UCD Message: Channel ID = %u (Telephony Return)",
2843                   type_number, upchid);
2844 
2845   pos = 4;
2846   while (tvb_reported_length_remaining(tvb, pos) > 0)
2847   {
2848     type = tvb_get_guint8 (tvb, pos);
2849     tlv_tree = proto_tree_add_subtree(ucd_tree, tvb, pos, -1,
2850                                             ett_docsis_tlv, &tlv_item,
2851                                             val_to_str(type, channel_tlv_vals,
2852                                                        "Unknown TLV (%u)"));
2853     proto_tree_add_uint (tlv_tree, hf_docsis_ucd_type, tvb, pos, 1, type);
2854     pos++;
2855     tlv_len_item = proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_ucd_length, tvb, pos, 1, ENC_NA, &length);
2856     pos++;
2857     proto_item_set_len(tlv_item, length + 2);
2858 
2859     switch (type)
2860     {
2861     case UCD_SYMBOL_RATE:
2862       if (length == 1)
2863       {
2864         symrate = tvb_get_guint8 (tvb, pos);
2865         proto_tree_add_uint (tlv_tree, hf_docsis_ucd_symbol_rate, tvb, pos, length, symrate * 160);
2866       }
2867       else
2868       {
2869         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2870       }
2871       break;
2872     case UCD_FREQUENCY:
2873       if (length == 4)
2874       {
2875         proto_tree_add_item (tlv_tree, hf_docsis_ucd_frequency, tvb, pos, length, ENC_BIG_ENDIAN);
2876       }
2877       else
2878       {
2879         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2880       }
2881       break;
2882     case UCD_PREAMBLE:
2883       proto_tree_add_item (tlv_tree, hf_docsis_ucd_preamble_pat, tvb, pos, length, ENC_NA);
2884       break;
2885     case UCD_BURST_DESCR:
2886     case UCD_BURST_DESCR5: /* DOCSIS 2.0 Upstream Channel Descriptor */
2887     case UCD_BURST_DESCR23:
2888       dissect_ucd_burst_descr(tvb, pinfo, tlv_tree, tlv_item, pos, length);
2889       break;
2890     case UCD_EXT_PREAMBLE:
2891       proto_tree_add_item (tlv_tree, hf_docsis_ucd_ext_preamble_pat, tvb, pos, length, ENC_NA);
2892       break;
2893     case UCD_SCDMA_MODE_ENABLED:
2894       if (length == 1)
2895       {
2896         proto_tree_add_item (tlv_tree, hf_docsis_ucd_scdma_mode_enabled, tvb, pos, length, ENC_BIG_ENDIAN);
2897       }
2898       else
2899       {
2900         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2901       }
2902       break;
2903     case UCD_SCDMA_SPREADING_INTERVAL:
2904       if (length == 1)
2905       {
2906         proto_tree_add_item (tlv_tree, hf_docsis_ucd_scdma_spreading_interval, tvb, pos, length, ENC_NA);
2907       }
2908       else
2909       {
2910         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2911       }
2912       break;
2913     case UCD_SCDMA_CODES_PER_MINI_SLOT:
2914       if (length == 1)
2915       {
2916         proto_tree_add_item (tlv_tree, hf_docsis_ucd_scdma_codes_per_mini_slot, tvb, pos, length, ENC_NA);
2917       }
2918       else
2919       {
2920         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2921       }
2922       break;
2923     case UCD_SCDMA_ACTIVE_CODES:
2924       if (length == 1)
2925       {
2926         proto_tree_add_item (tlv_tree, hf_docsis_ucd_scdma_active_codes, tvb, pos, length, ENC_NA);
2927       }
2928       else
2929       {
2930         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2931       }
2932       break;
2933     case UCD_SCDMA_CODE_HOPPING_SEED:
2934       if (length == 2)
2935       {
2936         proto_tree_add_item (tlv_tree, hf_docsis_ucd_scdma_code_hopping_seed, tvb, pos, length, ENC_NA);
2937       }
2938       else
2939       {
2940         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2941       }
2942       break;
2943     case UCD_SCDMA_US_RATIO_NUM:
2944       if (length == 2)
2945       {
2946         proto_tree_add_item (tlv_tree, hf_docsis_ucd_scdma_us_ratio_num, tvb, pos, length, ENC_NA);
2947       }
2948       else
2949       {
2950         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2951       }
2952       break;
2953     case UCD_SCDMA_US_RATIO_DENOM:
2954       if (length == 2)
2955       {
2956         proto_tree_add_item (tlv_tree, hf_docsis_ucd_scdma_us_ratio_denom, tvb, pos, length, ENC_NA);
2957       }
2958       else
2959       {
2960         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2961       }
2962       break;
2963     case UCD_SCDMA_TIMESTAMP_SNAPSHOT:
2964       if (length == 9)
2965       {
2966         proto_tree_add_item (tlv_tree, hf_docsis_ucd_scdma_timestamp_snapshot, tvb, pos, length, ENC_NA);
2967       }
2968       else
2969       {
2970         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2971       }
2972       break;
2973     case UCD_MAINTAIN_POWER_SPECTRAL_DENSITY:
2974       if (length == 1)
2975       {
2976         proto_tree_add_item (tlv_tree, hf_docsis_ucd_maintain_power_spectral_density, tvb, pos, length, ENC_BIG_ENDIAN);
2977       }
2978       else
2979       {
2980         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2981       }
2982       break;
2983     case UCD_RANGING_REQUIRED:
2984       if (length == 1)
2985       {
2986         proto_tree_add_item (tlv_tree, hf_docsis_ucd_ranging_required, tvb, pos, length, ENC_BIG_ENDIAN);
2987       }
2988       else
2989       {
2990         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
2991       }
2992       break;
2993     case UCD_MAX_SCHEDULED_CODES:
2994       if (length == 1)
2995       {
2996         proto_tree_add_item (tlv_tree, hf_docsis_ucd_max_scheduled_codes, tvb, pos, length, ENC_NA);
2997       }
2998       else
2999       {
3000         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3001       }
3002       break;
3003     case UCD_RANGING_HOLD_OFF_PRIORITY_FIELD:
3004       if (length == 4)
3005       {
3006         static int * const ucd_rnghoff[] = {
3007           &hf_docsis_ucd_rnghoff_cm,
3008           &hf_docsis_ucd_rnghoff_erouter,
3009           &hf_docsis_ucd_rnghoff_emta,
3010           &hf_docsis_ucd_rnghoff_estb,
3011           &hf_docsis_ucd_rnghoff_rsvd,
3012           &hf_docsis_ucd_rnghoff_id_ext,
3013           NULL
3014         };
3015 
3016         proto_tree_add_bitmask_list(tlv_tree, tvb, pos, length, ucd_rnghoff, ENC_BIG_ENDIAN);
3017       }
3018       else
3019       {
3020         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3021       }
3022       break;
3023     case UCD_RANGING_CHANNEL_CLASS_ID:
3024       if (length == 4)
3025       {
3026         static int * const ucd_chan_class_id[] = {
3027           &hf_docsis_ucd_chan_class_id_cm,
3028           &hf_docsis_ucd_chan_class_id_erouter,
3029           &hf_docsis_ucd_chan_class_id_emta,
3030           &hf_docsis_ucd_chan_class_id_estb,
3031           &hf_docsis_ucd_chan_class_id_rsvd,
3032           &hf_docsis_ucd_chan_class_id_id_ext,
3033           NULL
3034         };
3035 
3036         proto_tree_add_bitmask_list(tlv_tree, tvb, pos, length, ucd_chan_class_id, ENC_BIG_ENDIAN);
3037       }
3038       else
3039       {
3040         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3041       }
3042       break;
3043     case UCD_SCDMA_SELECTION_ACTIVE_CODES_AND_CODE_HOPPING:
3044       if (length == 1)
3045       {
3046         proto_tree_add_item (tlv_tree, hf_docsis_ucd_active_code_hopping, tvb, pos, length, ENC_NA);
3047       }
3048       else
3049       {
3050         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3051       }
3052       break;
3053     case UCD_SCDMA_SELECTION_STRING_FOR_ACTIVE_CODES:
3054       if (length == 16)
3055       {
3056         proto_tree_add_item (tlv_tree, hf_docsis_ucd_scdma_selection_active_codes, tvb, pos, length, ENC_NA);
3057       }
3058       else
3059       {
3060         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3061       }
3062       break;
3063     case UCD_HIGHER_UCD_FOR_SAME_UCID:
3064       if (length == 1)
3065       {
3066         proto_tree_add_item (tlv_tree, hf_docsis_ucd_higher_ucd_for_same_ucid, tvb, pos, length, ENC_NA);
3067         proto_tree_add_item (tlv_tree, hf_docsis_ucd_higher_ucd_for_same_ucid_resv, tvb, pos, length, ENC_BIG_ENDIAN);
3068       }
3069       else
3070       {
3071         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3072       }
3073       break;
3074     case UCD_CHANGE_IND_BITMASK:
3075       if (length == 2)
3076       {
3077         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_subc_excl_band, tvb, pos + 1, 1, ENC_NA);
3078         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_unused_subc, tvb, pos + 1, 1, ENC_NA);
3079         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_other_subc, tvb, pos + 1, 1, ENC_NA);
3080         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc5, tvb, pos + 1, 1, ENC_NA);
3081         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc6, tvb, pos + 1, 1, ENC_NA);
3082         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc9, tvb, pos + 1, 1, ENC_NA);
3083         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc10, tvb, pos + 1, 1, ENC_NA);
3084         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc11, tvb, pos + 1, 1, ENC_NA);
3085         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc12, tvb, pos, 1, ENC_NA);
3086         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc13, tvb, pos, 1, ENC_NA);
3087         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc3_or_4, tvb, pos, 1, ENC_NA);
3088         proto_tree_add_item (tlv_tree, hf_docsis_ucd_change_ind_bitmask_reserved, tvb, pos, 1, ENC_NA);
3089       }
3090       else
3091       {
3092         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3093       }
3094       break;
3095     case UCD_OFDMA_TIMESTAMP_SNAPSHOT:
3096       if (length == 9)
3097       {
3098         static int* const timestamp_snapshot_parts[] = {
3099           &hf_docsis_ucd_ofdma_timestamp_snapshot_reserved,
3100           &hf_docsis_ucd_ofdma_timestamp_snapshot_d30timestamp,
3101           &hf_docsis_ucd_ofdma_timestamp_snapshot_4msbits_of_div20,
3102           NULL
3103         };
3104         proto_tree_add_item (tlv_tree, hf_docsis_ucd_ofdma_timestamp_snapshot, tvb, pos, length, ENC_NA);
3105         proto_tree_add_bitmask_list(tlv_tree, tvb, pos, 5, timestamp_snapshot_parts, ENC_BIG_ENDIAN);
3106         proto_tree_add_item (tlv_tree, hf_docsis_ucd_ofdma_timestamp_snapshot_minislot_count, tvb, pos+5, length-5, ENC_NA);
3107       }
3108       else
3109       {
3110         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3111       }
3112       break;
3113     case UCD_OFDMA_CYCLIC_PREFIX_SIZE:
3114       if (length == 1)
3115       {
3116         proto_tree_add_item (tlv_tree, hf_docsis_ucd_ofdma_cyclic_prefix_size, tvb, pos, length, ENC_NA);
3117       }
3118       else
3119       {
3120         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3121       }
3122       break;
3123     case UCD_OFDMA_ROLLOFF_PERIOD_SIZE:
3124       if (length == 1)
3125       {
3126         proto_tree_add_item (tlv_tree, hf_docsis_ucd_ofdma_rolloff_period_size, tvb, pos, length, ENC_NA);
3127       }
3128       else
3129       {
3130         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3131       }
3132       break;
3133     case UCD_SUBCARRIER_SPACING:
3134       if (length == 1)
3135       {
3136         proto_tree_add_item (tlv_tree, hf_docsis_ucd_subc_spacing, tvb, pos, length, ENC_NA);
3137       }
3138       else
3139       {
3140         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3141       }
3142       break;
3143     case UCD_CENTER_FREQ_SUBC_0:
3144       if (length == 4)
3145       {
3146         proto_tree_add_item (tlv_tree, hf_docsis_ucd_cent_freq_subc0, tvb, pos, length, ENC_NA);
3147       }
3148       else
3149       {
3150         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3151       }
3152       break;
3153     case UCD_SUBC_EXCL_BAND:
3154       if ((length % 4) == 0)
3155       {
3156         for(i = 0; i < length; i+=4) {
3157           proto_tree_add_item (tlv_tree, hf_docsis_ucd_subcarrier_range, tvb, pos+i, 4, ENC_NA);
3158         }
3159       }
3160       else
3161       {
3162         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3163       }
3164       break;
3165     case UCD_UNUSED_SUBC_SPEC:
3166       if ((length % 4) == 0)
3167       {
3168         for(i = 0; i < length; i+=4) {
3169           proto_tree_add_item (tlv_tree, hf_docsis_ucd_subcarrier_range, tvb, pos+i, 4, ENC_NA);
3170         }
3171       }
3172       else
3173       {
3174         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3175       }
3176       break;
3177     case UCD_SYMB_IN_OFDMA_FRAME:
3178       if (length == 1)
3179       {
3180         proto_tree_add_item (tlv_tree, hf_docsis_ucd_symb_ofdma_frame, tvb, pos, length, ENC_NA);
3181       }
3182       else
3183       {
3184         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3185       }
3186       break;
3187     case UCD_RAND_SEED:
3188       if (length == 3)
3189       {
3190         proto_tree_add_item (tlv_tree, hf_docsis_ucd_rand_seed, tvb, pos, length, ENC_NA);
3191       }
3192       else
3193       {
3194         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3195       }
3196       break;
3197     }    /* switch(type) */
3198     pos += length;
3199   }      /* tvb_reported_length_remaining(tvb, pos) > 0 */
3200 
3201   return tvb_captured_length(tvb);
3202 }
3203 
3204 static int
3205 dissect_ucd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3206 {
3207   return dissect_any_ucd(tvb, pinfo, tree, proto_docsis_ucd, MGT_UCD);
3208 }
3209 
3210 static int
3211 dissect_any_map (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, guint8 version, void* data _U_)
3212 {
3213   guint32 i, numie, upchid, ucd_count, cat = 0;
3214   int pos;
3215   proto_item *it;
3216   proto_tree *map_tree;
3217   static int * const ies[] = {
3218     &hf_docsis_map_sid,
3219     &hf_docsis_map_iuc,
3220     &hf_docsis_map_offset,
3221     NULL
3222   };
3223 
3224   static int * const probe_ies[] = {
3225     &hf_docsis_map_sid,
3226     &hf_docsis_map_mer,
3227     &hf_docsis_map_pw,
3228     &hf_docsis_map_eq,
3229     &hf_docsis_map_st,
3230     &hf_docsis_map_probe_frame,
3231     &hf_docsis_map_symbol_in_frame,
3232     &hf_docsis_map_start_subc,
3233     &hf_docsis_map_subc_skip,
3234     NULL
3235   };
3236 
3237   switch (version) {
3238     case 1:
3239       it = proto_tree_add_item(tree, proto_docsis_map_v1, tvb, 0, -1, ENC_NA);
3240       break;
3241     case 5:
3242       it = proto_tree_add_item(tree, proto_docsis_map_v5, tvb, 0, -1, ENC_NA);
3243       break;
3244     default:
3245       it = proto_tree_add_item(tree, proto_docsis_map_v1, tvb, 0, -1, ENC_NA);
3246       expert_add_info_format(pinfo, it, &ei_docsis_mgmt_version_unknown, "Unknown MAP MAC Management version: %u", version);
3247       return tvb_captured_length(tvb);
3248   }
3249 
3250   map_tree = proto_item_add_subtree (it, ett_docsis_map);
3251 
3252   proto_tree_add_item_ret_uint (map_tree, hf_docsis_mgt_upstream_chid, tvb, 0, 1, ENC_BIG_ENDIAN, &upchid);
3253   proto_tree_add_item_ret_uint (map_tree, hf_docsis_map_ucd_count, tvb, 1, 1, ENC_BIG_ENDIAN, &ucd_count);
3254   switch (version) {
3255     case 1:
3256       proto_tree_add_item_ret_uint (map_tree, hf_docsis_map_numie, tvb, 2, 1, ENC_BIG_ENDIAN, &numie);
3257       proto_tree_add_item (map_tree, hf_docsis_map_rsvd, tvb, 3, 1, ENC_BIG_ENDIAN);
3258       break;
3259     case 5:
3260       proto_tree_add_item_ret_uint (map_tree, hf_docsis_map_numie_v5, tvb, 2, 2, ENC_BIG_ENDIAN, &numie);
3261       proto_tree_add_item (map_tree, hf_docsis_map_rsvd_v5, tvb, 3, 1, ENC_BIG_ENDIAN);
3262       proto_tree_add_item_ret_uint (map_tree, hf_docsis_map_cat, tvb, 3, 1, ENC_BIG_ENDIAN, &cat);
3263       break;
3264     default:
3265       it = proto_tree_add_item(tree, proto_docsis_map_v1, tvb, 0, -1, ENC_NA);
3266       expert_add_info_format(pinfo, it, &ei_docsis_mgmt_version_unknown, "Unknown MAP MAC Management version: %u", version);
3267       return tvb_captured_length(tvb);
3268   }
3269 
3270   if (upchid > 0)
3271     col_add_fstr (pinfo->cinfo, COL_INFO,
3272                   "Map Message:  Version: %d, Channel ID = %u (U%u), UCD Count = %u,  # IE's = %u",
3273                   version, upchid, upchid - 1, ucd_count, numie);
3274   else
3275     col_add_fstr (pinfo->cinfo, COL_INFO,
3276                   "Map Message:  Version: %d, Channel ID = %u (Telephony Return), UCD Count = %u, # IE's = %u",
3277                   version, upchid, ucd_count, numie);
3278 
3279   proto_tree_add_item (map_tree, hf_docsis_map_alloc_start, tvb, 4, 4, ENC_BIG_ENDIAN);
3280   if (cat == 0) {
3281     proto_tree_add_item (map_tree, hf_docsis_map_ack_time, tvb, 8, 4, ENC_BIG_ENDIAN);
3282     proto_tree_add_item (map_tree, hf_docsis_map_rng_start, tvb, 12, 1, ENC_BIG_ENDIAN);
3283     proto_tree_add_item (map_tree, hf_docsis_map_rng_end, tvb, 13, 1, ENC_BIG_ENDIAN);
3284     proto_tree_add_item (map_tree, hf_docsis_map_data_start, tvb, 14, 1, ENC_BIG_ENDIAN);
3285     proto_tree_add_item (map_tree, hf_docsis_map_data_end, tvb, 15, 1, ENC_BIG_ENDIAN);
3286 
3287     pos = 16;
3288     for (i = 0; i < numie; i++)
3289     {
3290       proto_tree_add_bitmask_with_flags(map_tree, tvb, pos, hf_docsis_map_ie, ett_docsis_map_ie, ies, ENC_BIG_ENDIAN, BMT_NO_FLAGS);
3291       pos = pos + 4;
3292     }
3293   }
3294   if (cat == 1) {
3295     pos = 8;
3296     for (i = 0; i < numie; i++)
3297     {
3298       proto_tree_add_bitmask_with_flags(map_tree, tvb, pos, hf_docsis_map_probe_ie, ett_docsis_map_probe_ie, probe_ies, ENC_BIG_ENDIAN, BMT_NO_FLAGS);
3299       pos = pos + 4;
3300     }
3301   }
3302 
3303   return tvb_captured_length(tvb);
3304 }
3305 
3306 
3307 static int dissect_map_v1 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_) {
3308   return dissect_any_map(tvb, pinfo, tree, MAP_v1, data);
3309 }
3310 
3311 static int dissect_map_v5 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_) {
3312   return dissect_any_map(tvb, pinfo, tree, MAP_v5, data);
3313 }
3314 
3315 static int
3316 dissect_rngreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3317 {
3318   proto_item *it;
3319   proto_tree *rngreq_tree;
3320   guint32 sid;
3321   guint8 version;
3322 
3323   it = proto_tree_add_item(tree, proto_docsis_rngreq, tvb, 0, -1, ENC_NA);
3324   rngreq_tree = proto_item_add_subtree (it, ett_docsis_rngreq);
3325 
3326   version = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_docsis_mgmt, KEY_MGMT_VERSION));
3327   if (version == 1) {
3328     proto_tree_add_item (rngreq_tree, hf_docsis_rngreq_sid_field_bit15_14, tvb, 0, 1, ENC_BIG_ENDIAN);
3329   }
3330   if (version == 5) {
3331     //RNG-REQ sent to 3.1 CMTS
3332     proto_tree_add_item (rngreq_tree, hf_docsis_rngreq_sid_field_bit15, tvb, 0, 1, ENC_BIG_ENDIAN);
3333     proto_tree_add_item (rngreq_tree, hf_docsis_rngreq_sid_field_bit14, tvb, 0, 1, ENC_BIG_ENDIAN);
3334   }
3335   proto_tree_add_item_ret_uint (rngreq_tree, hf_docsis_rngreq_sid, tvb, 0, 2, ENC_BIG_ENDIAN, &sid);
3336 
3337   if (sid > 0)
3338     col_add_fstr (pinfo->cinfo, COL_INFO, "Ranging Request: SID = %u",
3339                       sid);
3340   else
3341     col_set_str(pinfo->cinfo, COL_INFO, "Initial Ranging Request SID = 0");
3342 
3343   proto_tree_add_item (rngreq_tree, hf_docsis_mgt_down_chid, tvb, 2, 1, ENC_BIG_ENDIAN);
3344   proto_tree_add_item (rngreq_tree, hf_docsis_rngreq_pend_compl, tvb, 3, 1, ENC_BIG_ENDIAN);
3345 
3346   return tvb_captured_length(tvb);
3347 }
3348 
3349 static void
3350 dissect_rngrsp_transmit_equalization_encodings_scdma_tdma(tvbuff_t * tvb, proto_item * it, guint start, guint16 len)
3351 {
3352   guint16 i;
3353   proto_tree *transmit_equalization_encodings_tree, *coef_tree;
3354 
3355   transmit_equalization_encodings_tree = proto_item_add_subtree (it, ett_docsis_rngrsp_tlv_transmit_equalization_encodings);
3356 
3357   proto_tree_add_item (transmit_equalization_encodings_tree, hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_main_tap_location, tvb, start, 1, ENC_BIG_ENDIAN);
3358   proto_tree_add_item (transmit_equalization_encodings_tree, hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_number_of_forward_taps_per_symbol, tvb, start + 1, 1, ENC_BIG_ENDIAN);
3359   proto_tree_add_item (transmit_equalization_encodings_tree, hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_number_of_forward_taps_n, tvb, start + 2, 1, ENC_BIG_ENDIAN);
3360   proto_tree_add_item (transmit_equalization_encodings_tree, hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_reserved, tvb, start + 3, 1, ENC_BIG_ENDIAN);
3361 
3362   for(i=4; i < len; i+=4) {
3363     gint real, imag;
3364     coef_tree = proto_tree_add_subtree_format (transmit_equalization_encodings_tree, tvb, start + i, 4, ett_docsis_rngrsp_tlv_transmit_equalization_encodings_coef, NULL, "Tap %d: ", i/4);
3365     proto_tree_add_item_ret_int (coef_tree, hf_docsis_rngrsp_trans_eq_enc_coef_real, tvb, start + i, 2, ENC_BIG_ENDIAN, &real);
3366     proto_tree_add_item_ret_int (coef_tree, hf_docsis_rngrsp_trans_eq_enc_coef_imag, tvb, start + i + 2, 2, ENC_BIG_ENDIAN, &imag);
3367     proto_item_append_text(coef_tree, "real: %f, imag: %f", (gint16) real/16384.0, (gint16) imag/16384.0);
3368   }
3369 }
3370 
3371 static void
3372 dissect_rngrsp_transmit_equalization_encodings_ofdma(tvbuff_t * tvb, proto_tree * tree, guint start, guint16 len)
3373 {
3374   guint16 i;
3375   proto_item *it;
3376   proto_tree *transmit_equalization_encodings_tree, *coef_tree;
3377   guint lowest_subc;
3378 
3379   it = proto_tree_add_item(tree, hf_docsis_rngrsp_trans_eq_data, tvb, start, len, ENC_NA);
3380   transmit_equalization_encodings_tree = proto_item_add_subtree (it, ett_docsis_rngrsp_tlv_transmit_equalization_encodings);
3381 
3382   proto_tree_add_item_ret_uint (transmit_equalization_encodings_tree, hf_docsis_rngrsp_trans_eq_enc_lowest_subc, tvb, start, 3, ENC_BIG_ENDIAN, &lowest_subc);
3383   proto_tree_add_item (transmit_equalization_encodings_tree, hf_docsis_rngrsp_trans_eq_enc_highest_subc, tvb, start, 3, ENC_BIG_ENDIAN);
3384   for(i=3; i < len; i+=4) {
3385     gint real, imag;
3386     coef_tree = proto_tree_add_subtree_format (transmit_equalization_encodings_tree, tvb, start + i, 4, ett_docsis_rngrsp_tlv_transmit_equalization_encodings_coef, NULL, "Subcarrier %d: ", lowest_subc + (i-3)/4);
3387     proto_tree_add_item_ret_int (coef_tree, hf_docsis_rngrsp_trans_eq_enc_coef_real, tvb, start + i, 2, ENC_BIG_ENDIAN, &real);
3388     proto_tree_add_item_ret_int (coef_tree, hf_docsis_rngrsp_trans_eq_enc_coef_imag, tvb, start + i + 2, 2, ENC_BIG_ENDIAN, &imag);
3389     proto_item_append_text(coef_tree, "real: %f, imag: %f", (gint16) real/16384.0, (gint16) imag/16384.0);
3390   }
3391 }
3392 
3393 static void
3394 dissect_rngrsp_commanded_power(tvbuff_t * tvb, proto_tree * tree, guint8 start, guint16 len)
3395 {
3396   guint16 pos;
3397   guint16 i;
3398   guint8 tlvtype, tlvlen;
3399   proto_item *it;
3400   proto_tree *commanded_power_tree;
3401   proto_tree *commanded_power_subtlv_tree;
3402   proto_item *rngrsptlv_commanded_power_subtlv;
3403 
3404 
3405   it = proto_tree_add_item(tree, hf_docsis_rngrsp_commanded_power_data, tvb, start-2, len+2, ENC_NA);
3406   commanded_power_tree = proto_item_add_subtree (it, ett_docsis_rngrsp_tlv_commanded_power);
3407 
3408 
3409   pos = start;
3410   while (pos < start + len)
3411   {
3412     tlvtype = tvb_get_guint8 (tvb, pos);
3413     commanded_power_subtlv_tree = proto_tree_add_subtree(commanded_power_tree, tvb, pos, -1,
3414                                   ett_docsis_rngrsp_tlv_commanded_power_subtlv, &rngrsptlv_commanded_power_subtlv,
3415                                   val_to_str(tlvtype, rngrsp_tlv_commanded_power_subtlv_vals,
3416                                   "Unknown TLV (%u)"));
3417     pos++;
3418     tlvlen = tvb_get_guint8 (tvb, pos);
3419     pos++;
3420 
3421     switch (tlvtype)
3422     {
3423       case RNGRSP_COMMANDED_POWER_DYNAMIC_RANGE_WINDOW:
3424         if (tlvlen == 1)
3425         {
3426           proto_tree_add_item (commanded_power_subtlv_tree,
3427                                     hf_docsis_rngrsp_commanded_power_dynamic_range_window, tvb, pos,
3428                                     tlvlen, ENC_BIG_ENDIAN);
3429         }
3430         break;
3431       case RNGRSP_COMMANDED_POWER_UCID_AND_POWER_LEVEL_LIST:
3432         if ((tlvlen %3)== 0)
3433         {
3434           for(i=0; i < tlvlen; i+=3)
3435           {
3436              proto_tree_add_item (commanded_power_subtlv_tree,
3437                                       hf_docsis_rngrsp_commanded_power_ucid, tvb, pos + i,
3438                                       1, ENC_BIG_ENDIAN);
3439              proto_tree_add_item (commanded_power_subtlv_tree,
3440                                       hf_docsis_rngrsp_commanded_power_trans_pow_lvl, tvb, pos + i +1,
3441                                       2, ENC_BIG_ENDIAN);
3442           }
3443         }
3444         break;
3445       }
3446       pos += tlvlen;
3447   }
3448 }
3449 
3450 static void
3451 dissect_rngrsp_tlv (tvbuff_t * tvb, packet_info * pinfo, proto_tree * rngrsp_tree)
3452 {
3453   proto_item *rngrsptlv_item, *it;
3454   proto_tree *rngrsptlv_tree;
3455   guint pos = 0;
3456   guint tlvlen;
3457   guint8 tlvtype;
3458 
3459 
3460   while (tvb_reported_length_remaining(tvb, pos) > 0)
3461   {
3462     tlvtype = tvb_get_guint8 (tvb, pos);
3463     rngrsptlv_tree = proto_tree_add_subtree(rngrsp_tree, tvb, pos, -1,
3464                                   ett_docsis_rngrsptlv, &rngrsptlv_item,
3465                                   val_to_str(tlvtype, rngrsp_tlv_vals,
3466                                   "Unknown TLV (%u)"));
3467     proto_tree_add_uint (rngrsptlv_tree, hf_docsis_rngrsp_type, tvb, pos, 1, tlvtype);
3468     pos++;
3469     tlvlen = tvb_get_guint8 (tvb, pos);
3470     if  (tlvtype == RNGRSP_TRANSMIT_EQ_ADJUST_OFDMA_CHANNELS || tlvtype == RNGRSP_TRANSMIT_EQ_SET_OFDMA_CHANNELS) {
3471       proto_tree_add_item_ret_uint (rngrsptlv_tree, hf_docsis_rngrsp_length, tvb, pos, 2, ENC_NA, &tlvlen);
3472       pos += 2;
3473     } else {
3474       proto_tree_add_item_ret_uint (rngrsptlv_tree, hf_docsis_rngrsp_length, tvb, pos, 1, ENC_NA, &tlvlen);
3475       pos++;
3476     }
3477     proto_item_set_len(rngrsptlv_item, tlvlen + 2);
3478     switch (tlvtype)
3479     {
3480     case RNGRSP_TIMING:
3481       if (tlvlen == 4)
3482       {
3483         proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_timing_adj, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
3484       }
3485       break;
3486     case RNGRSP_PWR_LEVEL_ADJ:
3487       if (tlvlen == 1)
3488       {
3489         proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_power_adj, tvb, pos, tlvlen, ENC_NA);
3490       }
3491       break;
3492     case RNGRSP_OFFSET_FREQ_ADJ:
3493       if (tlvlen == 2)
3494       {
3495         proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_freq_adj, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
3496       }
3497       break;
3498     case RNGRSP_TRANSMIT_EQ_ADJ:
3499       it = proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_xmit_eq_adj, tvb, pos, tlvlen, ENC_NA);
3500       dissect_rngrsp_transmit_equalization_encodings_scdma_tdma(tvb, it, pos, tlvlen);
3501       break;
3502     case RNGRSP_RANGING_STATUS:
3503       if (tlvlen == 1)
3504       {
3505         proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_ranging_status, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
3506       }
3507       break;
3508     case RNGRSP_DOWN_FREQ_OVER:
3509       if (tlvlen == 4)
3510       {
3511         proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_down_freq_over, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
3512       }
3513       break;
3514     case RNGRSP_UP_CHID_OVER:
3515       if (tlvlen == 1)
3516       {
3517         proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_upstream_ch_over, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
3518       }
3519       break;
3520     case RNGRSP_TRANSMIT_EQ_SET:
3521       it = proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_xmit_eq_set, tvb, pos, tlvlen, ENC_NA);
3522       dissect_rngrsp_transmit_equalization_encodings_scdma_tdma(tvb, it, pos, tlvlen);
3523       break;
3524     case RNGRSP_T4_TIMEOUT_MULTIPLIER:
3525       if (tlvlen == 1)
3526         proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_rngrsp_t4_timeout_multiplier, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
3527       else
3528       {
3529         expert_add_info_format(pinfo, rngrsptlv_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
3530       }
3531       break;
3532     case RNGRSP_DYNAMIC_RANGE_WINDOW_UPPER_EDGE:
3533       if (tlvlen == 1)
3534         proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_dynamic_range_window_upper_edge, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
3535       else
3536       {
3537         expert_add_info_format(pinfo, rngrsptlv_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", tlvlen);
3538       }
3539       break;
3540     case RNGRSP_TRANSMIT_EQ_ADJUST_OFDMA_CHANNELS:
3541       dissect_rngrsp_transmit_equalization_encodings_ofdma(tvb, rngrsptlv_tree, pos, tlvlen);
3542       break;
3543     case RNGRSP_TRANSMIT_EQ_SET_OFDMA_CHANNELS:
3544       dissect_rngrsp_transmit_equalization_encodings_ofdma(tvb, rngrsptlv_tree, pos, tlvlen);
3545       break;
3546     case RNGRSP_COMMANDED_POWER:
3547       dissect_rngrsp_commanded_power(tvb, rngrsptlv_tree, pos, tlvlen);
3548       break;
3549 
3550     default:
3551        proto_tree_add_item (rngrsp_tree, hf_docsis_rngrsp_tlv_unknown, tvb, pos, tlvlen, ENC_NA);
3552     }                   /* switch(tlvtype) */
3553     pos += tlvlen;
3554   }                       /* while (tvb_reported_length_remaining(tvb, pos) > 0) */
3555 }
3556 
3557 static int
3558 dissect_rngrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3559 {
3560   proto_item *it;
3561   proto_tree *rngrsp_tree;
3562   tvbuff_t *tlv_tvb = NULL;
3563   guint32 sid, upchid;
3564   address save_src, save_dst;
3565   guint version, multipart, number_of_fragments, fragment_sequence_number;
3566 
3567 
3568   it = proto_tree_add_item(tree, proto_docsis_rngrsp, tvb, 0, -1, ENC_NA);
3569   rngrsp_tree = proto_item_add_subtree (it, ett_docsis_rngrsp);
3570 
3571   proto_tree_add_item_ret_uint (rngrsp_tree, hf_docsis_rngrsp_sid, tvb, 0, 2, ENC_BIG_ENDIAN, &sid);
3572   proto_tree_add_item_ret_uint (rngrsp_tree, hf_docsis_mgt_upstream_chid, tvb, 2, 1, ENC_BIG_ENDIAN, &upchid);
3573 
3574   if (upchid > 0)
3575     col_add_fstr (pinfo->cinfo, COL_INFO,
3576                   "Ranging Response: SID = %u, Upstream Channel = %u (U%u)",
3577                   sid, upchid, upchid - 1);
3578   else
3579     col_add_fstr (pinfo->cinfo, COL_INFO,
3580                   "Ranging Response: SID = %u, Telephony Return", sid);
3581 
3582 
3583   version = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_docsis_mgmt, KEY_MGMT_VERSION));
3584   if (version > 4) {
3585     multipart = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_docsis_mgmt, KEY_MGMT_MULTIPART));
3586   } else {
3587     multipart = 0;
3588   }
3589 
3590   /* Reassemble TLVs */
3591   if (tvb_reported_length_remaining(tvb, 3) > 0) {
3592     if (version > 4 && multipart) {
3593       /* Fragmented data */
3594       number_of_fragments = (multipart >> 4);
3595       fragment_sequence_number = (multipart & 0x0F);
3596 
3597       /* DOCSIS MAC management messages do not have network (IP) address. Use link (MAC) address instead. Same workflow as in wimax. */
3598       /* Save address pointers. */
3599       copy_address_shallow(&save_src, &pinfo->src);
3600       copy_address_shallow(&save_dst, &pinfo->dst);
3601       /* Use dl_src and dl_dst in defragmentation. */
3602       copy_address_shallow(&pinfo->src, &pinfo->dl_src);
3603       copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
3604 
3605       fragment_head* fh = fragment_add_seq_check(&docsis_rngrsp_tlv_reassembly_table, tvb, 3, pinfo, sid, NULL,
3606                                                 fragment_sequence_number,
3607                                                 tvb_reported_length_remaining(tvb, 3),
3608                                                 (fragment_sequence_number != number_of_fragments));
3609 
3610       /* Restore address pointers. */
3611       copy_address_shallow(&pinfo->src, &save_src);
3612       copy_address_shallow(&pinfo->dst, &save_dst);
3613 
3614       if (fh) {
3615         tlv_tvb = process_reassembled_data(tvb, 3, pinfo, "Reassembled RNGRSP TLV", fh, &docsis_tlv_frag_items,
3616                                            NULL, rngrsp_tree);
3617 
3618         if (tlv_tvb && tvb_reported_length(tlv_tvb) > 0) {
3619           dissect_rngrsp_tlv(tlv_tvb, pinfo, rngrsp_tree);
3620         }
3621       }
3622     } else { /* version > 4 && multipart */
3623       tlv_tvb = tvb_new_subset_remaining (tvb, 3);
3624       dissect_rngrsp_tlv(tlv_tvb, pinfo, rngrsp_tree);
3625     }
3626   }
3627 
3628   return tvb_captured_length(tvb);
3629 }
3630 
3631 static int
3632 dissect_regreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3633 {
3634   proto_item *it;
3635   proto_tree *regreq_tree;
3636   guint32 sid;
3637   tvbuff_t *next_tvb;
3638 
3639   it = proto_tree_add_item(tree, proto_docsis_regreq, tvb, 0, -1, ENC_NA);
3640   regreq_tree = proto_item_add_subtree (it, ett_docsis_regreq);
3641 
3642   proto_tree_add_item_ret_uint (regreq_tree, hf_docsis_regreq_sid, tvb, 0, 2, ENC_BIG_ENDIAN, &sid);
3643 
3644   col_add_fstr (pinfo->cinfo, COL_INFO, "Registration Request SID = %u", sid);
3645 
3646   /* Call Dissector for Appendix C TlV's */
3647   next_tvb = tvb_new_subset_remaining (tvb, 2);
3648   call_dissector (docsis_tlv_handle, next_tvb, pinfo, regreq_tree);
3649   return tvb_captured_length(tvb);
3650 }
3651 
3652 static int
3653 dissect_regrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3654 {
3655   proto_item *it;
3656   proto_tree *regrsp_tree;
3657   guint32 sid, response;
3658   tvbuff_t *next_tvb;
3659 
3660   it = proto_tree_add_item(tree, proto_docsis_regrsp, tvb, 0, -1, ENC_NA);
3661   regrsp_tree = proto_item_add_subtree (it, ett_docsis_regrsp);
3662   proto_tree_add_item_ret_uint (regrsp_tree, hf_docsis_regrsp_sid, tvb, 0, 2, ENC_BIG_ENDIAN, &sid);
3663   proto_tree_add_item_ret_uint (regrsp_tree, hf_docsis_regrsp_response, tvb, 2, 1, ENC_BIG_ENDIAN, &response);
3664 
3665   col_add_fstr (pinfo->cinfo, COL_INFO,
3666                 "Registration Response SID = %u (%s)", sid,
3667                 val_to_str_ext (response, &docsis_conf_code_ext, "%d"));
3668 
3669   /* Call Dissector for Appendix C TLVs */
3670   next_tvb = tvb_new_subset_remaining (tvb, 3);
3671   call_dissector (docsis_tlv_handle, next_tvb, pinfo, regrsp_tree);
3672   return tvb_captured_length(tvb);
3673 }
3674 
3675 static int
3676 dissect_uccreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3677 {
3678   proto_item *it;
3679   proto_tree *uccreq_tree;
3680   guint32 chid;
3681 
3682   it = proto_tree_add_item (tree, proto_docsis_uccreq, tvb, 0, -1, ENC_NA);
3683   uccreq_tree = proto_item_add_subtree (it, ett_docsis_uccreq);
3684 
3685   proto_tree_add_item_ret_uint (uccreq_tree, hf_docsis_mgt_upstream_chid, tvb, 0, 1, ENC_BIG_ENDIAN, &chid);
3686 
3687   col_add_fstr (pinfo->cinfo, COL_INFO,
3688                 "Upstream Channel Change request: Channel ID = %u (U%u)",
3689                 chid, (chid > 0 ? chid - 1 : chid));
3690 
3691   return tvb_captured_length(tvb);
3692 }
3693 
3694 static int
3695 dissect_uccrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3696 {
3697   proto_item *it;
3698   proto_tree *uccrsp_tree;
3699   guint32 chid;
3700 
3701   it = proto_tree_add_item(tree, proto_docsis_uccrsp, tvb, 0, -1, ENC_NA);
3702   uccrsp_tree = proto_item_add_subtree (it, ett_docsis_uccrsp);
3703 
3704   proto_tree_add_item_ret_uint (uccrsp_tree, hf_docsis_mgt_upstream_chid, tvb, 0, 1, ENC_BIG_ENDIAN, &chid);
3705 
3706   col_add_fstr (pinfo->cinfo, COL_INFO,
3707                 "Upstream Channel Change response: Channel ID = %u (U%u)",
3708                 chid, (chid > 0 ? chid - 1 : chid));
3709 
3710   return tvb_captured_length(tvb);
3711 }
3712 
3713 /* The dissect_attrs() function does the actual work to dissect the
3714  * attributes.  It's called recursively, to dissect embedded attributes
3715  */
3716 static void
3717 dissect_attrs (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
3718 {
3719   guint8 type;
3720   guint32 length;
3721   int pos = 0;
3722   gint total_len;
3723   proto_tree *attr_tree, *attr_subtree;
3724   proto_item *ti, *tlv_item, *tlv_len_item;
3725   tvbuff_t *attr_tvb;
3726 
3727   total_len = tvb_reported_length_remaining (tvb, 0);
3728   while (pos < total_len)
3729   {
3730     type = tvb_get_guint8 (tvb, pos);
3731     attr_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
3732                                   ett_docsis_bpkmattrtlv, &tlv_item,
3733                                   val_to_str(type, bpkmattr_tlv_vals,
3734                                   "Unknown TLV (%u)"));
3735     proto_tree_add_uint (attr_tree, hf_docsis_bpkmattr_type, tvb, pos, 1, type);
3736     pos++;
3737     tlv_len_item = proto_tree_add_item_ret_uint (attr_tree, hf_docsis_bpkmattr_length,
3738                            tvb, pos, 2, ENC_BIG_ENDIAN, &length);
3739     pos += 2;
3740     proto_item_set_len(tlv_item, length + 2);
3741 
3742     switch (type)
3743     {
3744     case BPKM_RESERVED:
3745       break;
3746     case BPKM_SERIAL_NUM:
3747       proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_serial_num, tvb, pos, length, ENC_ASCII|ENC_NA);
3748       break;
3749     case BPKM_MANUFACTURER_ID:
3750       if (length == 3)
3751         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_manf_id, tvb, pos, length, ENC_NA);
3752       else
3753         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3754       break;
3755     case BPKM_MAC_ADDR:
3756       if (length == 6)
3757         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_mac_addr, tvb, pos, length, ENC_NA);
3758       else
3759         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3760       break;
3761     case BPKM_RSA_PUB_KEY:
3762       proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_rsa_pub_key, tvb, pos, length, ENC_NA);
3763       break;
3764     case BPKM_CM_ID:
3765       ti = proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_cm_id, tvb, pos, length, ENC_NA);
3766       attr_subtree = proto_item_add_subtree(ti, ett_docsis_bpkmattr_cmid);
3767       attr_tvb = tvb_new_subset_length (tvb, pos, length);
3768       dissect_attrs (attr_tvb, pinfo, attr_subtree);
3769       break;
3770     case BPKM_DISPLAY_STR:
3771       proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_display_str, tvb, pos, length, ENC_ASCII|ENC_NA);
3772       break;
3773     case BPKM_AUTH_KEY:
3774       if ((length == 96) || (length == 128) || (length == 256))
3775         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_auth_key, tvb, pos, length, ENC_NA);
3776       else
3777         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3778       break;
3779     case BPKM_TEK:
3780       if (length == 8 || length == 16)
3781         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_tek, tvb, pos, length, ENC_NA);
3782       else
3783         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3784       break;
3785     case BPKM_KEY_LIFETIME:
3786       if (length == 4)
3787         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_key_life, tvb, pos, length, ENC_BIG_ENDIAN);
3788       else
3789         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3790       break;
3791     case BPKM_KEY_SEQ_NUM:
3792       if (length == 1)
3793         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_key_seq, tvb, pos, length, ENC_BIG_ENDIAN);
3794       else
3795         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3796       break;
3797     case BPKM_HMAC_DIGEST:
3798       if (length == 20)
3799         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_hmac_digest, tvb, pos, length, ENC_NA);
3800       else
3801         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3802       break;
3803     case BPKM_SAID:
3804       if (length == 2)
3805         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_said, tvb, pos, length, ENC_BIG_ENDIAN);
3806       else
3807         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3808       break;
3809     case BPKM_TEK_PARAM:
3810       ti = proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_tek_params, tvb, pos, length, ENC_NA);
3811       attr_subtree = proto_item_add_subtree(ti, ett_docsis_bpkmattr_tekp);
3812       attr_tvb = tvb_new_subset_length (tvb, pos, length);
3813       dissect_attrs (attr_tvb, pinfo, attr_subtree);
3814       break;
3815     case BPKM_OBSOLETED:
3816       break;
3817     case BPKM_CBC_IV:
3818       if (length == 8 || length == 16)
3819         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_cbc_iv, tvb, pos, length, ENC_NA);
3820       else
3821         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3822       break;
3823     case BPKM_ERROR_CODE:
3824       if (length == 1)
3825         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_error_code, tvb, pos, length, ENC_BIG_ENDIAN);
3826       else
3827         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3828       break;
3829     case BPKM_CA_CERT:
3830       proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_ca_cert, tvb, pos, length, ENC_NA);
3831       break;
3832     case BPKM_CM_CERT:
3833       proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_cm_cert, tvb, pos, length, ENC_NA);
3834       break;
3835     case BPKM_SEC_CAPABILITIES:
3836       ti = proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_security_cap, tvb, pos, length, ENC_NA);
3837       attr_subtree = proto_item_add_subtree(ti, ett_docsis_bpkmattr_scap);
3838       attr_tvb = tvb_new_subset_length (tvb, pos, length);
3839       dissect_attrs (attr_tvb, pinfo, attr_subtree);
3840       break;
3841     case BPKM_CRYPTO_SUITE:
3842       if (length == 2)
3843         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_crypto_suite, tvb, pos, length, ENC_BIG_ENDIAN);
3844       else
3845         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3846       break;
3847     case BPKM_CRYPTO_SUITE_LIST:
3848       proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_crypto_suite_list, tvb, pos, length, ENC_NA);
3849       break;
3850     case BPKM_BPI_VERSION:
3851       if (length == 1)
3852         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_bpi_version, tvb, pos, length, ENC_BIG_ENDIAN);
3853       else
3854         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3855       break;
3856     case BPKM_SA_DESCRIPTOR:
3857       ti = proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_sa_descr, tvb, pos, length, ENC_NA);
3858       attr_subtree = proto_item_add_subtree(ti, ett_docsis_bpkmattr_sadsc);
3859       attr_tvb = tvb_new_subset_length (tvb, pos, length);
3860       dissect_attrs (attr_tvb, pinfo, attr_subtree);
3861       break;
3862     case BPKM_SA_TYPE:
3863       if (length == 1)
3864         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_sa_type, tvb, pos, length, ENC_BIG_ENDIAN);
3865       else
3866         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3867       break;
3868     case BPKM_SA_QUERY:
3869       ti = proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_sa_query, tvb, pos, length, ENC_NA);
3870       attr_subtree = proto_item_add_subtree(ti, ett_docsis_bpkmattr_saqry);
3871       attr_tvb = tvb_new_subset_length (tvb, pos, length);
3872       dissect_attrs (attr_tvb, pinfo, attr_subtree);
3873       break;
3874     case BPKM_SA_QUERY_TYPE:
3875       if (length == 1)
3876         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_sa_query_type, tvb, pos, length, ENC_BIG_ENDIAN);
3877       else
3878         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3879       break;
3880     case BPKM_IP_ADDRESS:
3881       if (length == 4)
3882         proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_ip_address, tvb, pos, length, ENC_BIG_ENDIAN);
3883       else
3884         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
3885       break;
3886     case BPKM_VENDOR_DEFINED:
3887       proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_vendor_def, tvb, pos, length, ENC_NA);
3888       break;
3889     case BPKM_DNLD_PARAMS:
3890       ti = proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_download_param, tvb, pos, length, ENC_NA);
3891       attr_subtree = proto_item_add_subtree(ti, ett_docsis_bpkmattr_dnld);
3892       attr_tvb = tvb_new_subset_length (tvb, pos, length);
3893       dissect_attrs (attr_tvb, pinfo, attr_subtree);
3894       break;
3895     default:
3896       proto_tree_add_item (attr_tree, hf_docsis_bpkmattr_vendor_def, tvb, pos, length, ENC_NA);
3897       break;
3898     }
3899 
3900     pos += length;            /* switch */
3901   }                           /* while */
3902 }
3903 
3904 static int
3905 dissect_bpkmreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3906 {
3907   proto_item *it;
3908   proto_tree *bpkmreq_tree, *bpkmattr_tree;
3909   guint32 code;
3910   tvbuff_t *attrs_tvb;
3911 
3912   it = proto_tree_add_item(tree, proto_docsis_bpkmreq, tvb, 0, -1, ENC_NA);
3913   bpkmreq_tree = proto_item_add_subtree (it, ett_docsis_bpkmreq);
3914   proto_tree_add_item_ret_uint (bpkmreq_tree, hf_docsis_bpkm_code, tvb, 0, 1,
3915                            ENC_BIG_ENDIAN, &code);
3916 
3917   col_add_fstr (pinfo->cinfo, COL_INFO, "BPKM Request (%s)",
3918                 val_to_str (code, code_field_vals, "%d"));
3919 
3920   proto_tree_add_item (bpkmreq_tree, hf_docsis_bpkm_ident, tvb, 1, 1, ENC_BIG_ENDIAN);
3921   proto_tree_add_item (bpkmreq_tree, hf_docsis_bpkm_length, tvb, 2, 2, ENC_BIG_ENDIAN);
3922   it = proto_tree_add_item(bpkmreq_tree, hf_docsis_bpkmattr, tvb, 4, tvb_reported_length_remaining(tvb, 4), ENC_NA);
3923   bpkmattr_tree = proto_item_add_subtree (it, ett_docsis_bpkmattr);
3924 
3925   attrs_tvb = tvb_new_subset_remaining (tvb, 4);
3926   dissect_attrs(attrs_tvb, pinfo, bpkmattr_tree);
3927   return tvb_captured_length(tvb);
3928 }
3929 
3930 static int
3931 dissect_bpkmrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3932 {
3933   proto_item *it;
3934   proto_tree *bpkmrsp_tree, *bpkmattr_tree;
3935   guint32 code;
3936   tvbuff_t *attrs_tvb;
3937 
3938   it = proto_tree_add_item(tree, proto_docsis_bpkmrsp, tvb, 0, -1, ENC_NA);
3939   bpkmrsp_tree = proto_item_add_subtree (it, ett_docsis_bpkmrsp);
3940 
3941   proto_tree_add_item_ret_uint (bpkmrsp_tree, hf_docsis_bpkm_code, tvb, 0, 1, ENC_BIG_ENDIAN, &code);
3942 
3943   col_add_fstr (pinfo->cinfo, COL_INFO, "BPKM Response (%s)",
3944                 val_to_str (code, code_field_vals, "Unknown code %u"));
3945 
3946   proto_tree_add_item (bpkmrsp_tree, hf_docsis_bpkm_ident, tvb, 1, 1, ENC_BIG_ENDIAN);
3947   proto_tree_add_item (bpkmrsp_tree, hf_docsis_bpkm_length, tvb, 2, 2, ENC_BIG_ENDIAN);
3948   it = proto_tree_add_item(bpkmrsp_tree, hf_docsis_bpkmattr, tvb, 4, tvb_reported_length_remaining(tvb, 4), ENC_NA);
3949   bpkmattr_tree = proto_item_add_subtree (it, ett_docsis_bpkmattr);
3950 
3951   attrs_tvb = tvb_new_subset_remaining (tvb, 4);
3952   dissect_attrs(attrs_tvb, pinfo, bpkmattr_tree);
3953   return tvb_captured_length(tvb);
3954 }
3955 
3956 static int
3957 dissect_regack (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3958 {
3959   proto_item *it;
3960   proto_tree *regack_tree;
3961   guint32 sid, response;
3962   tvbuff_t *next_tvb;
3963 
3964   it = proto_tree_add_item (tree, proto_docsis_regack, tvb, 0, -1, ENC_NA);
3965   regack_tree = proto_item_add_subtree (it, ett_docsis_regack);
3966 
3967   proto_tree_add_item_ret_uint (regack_tree, hf_docsis_regack_sid, tvb, 0, 2, ENC_BIG_ENDIAN, &sid);
3968   proto_tree_add_item_ret_uint (regack_tree, hf_docsis_regack_response, tvb, 2, 1, ENC_BIG_ENDIAN, &response);
3969 
3970   col_add_fstr (pinfo->cinfo, COL_INFO,
3971                 "Registration Acknowledge SID = %u (%s)", sid,
3972                 val_to_str_ext (response, &docsis_conf_code_ext, "%d"));
3973 
3974   /* Call Dissector for Appendix C TLVs */
3975   if(tvb_reported_length_remaining(tvb, 3) > 0 )
3976   {
3977     next_tvb = tvb_new_subset_remaining (tvb, 3);
3978     call_dissector (docsis_tlv_handle, next_tvb, pinfo, regack_tree);
3979   }
3980 
3981   return tvb_captured_length(tvb);
3982 }
3983 
3984 static int
3985 dissect_dsareq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
3986 {
3987   proto_item *it;
3988   proto_tree *dsareq_tree;
3989   guint32 transid;
3990   tvbuff_t *next_tvb;
3991 
3992   it = proto_tree_add_item(tree, proto_docsis_dsareq, tvb, 0, -1, ENC_NA);
3993   dsareq_tree = proto_item_add_subtree (it, ett_docsis_dsareq);
3994 
3995   proto_tree_add_item_ret_uint (dsareq_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
3996 
3997   col_add_fstr (pinfo->cinfo, COL_INFO,
3998                 "Dynamic Service Addition Request: Transaction ID = %u", transid);
3999 
4000   /* Call Dissector for Appendix C TLVs */
4001   next_tvb = tvb_new_subset_remaining (tvb, 2);
4002   call_dissector (docsis_tlv_handle, next_tvb, pinfo, dsareq_tree);
4003   return tvb_captured_length(tvb);
4004 }
4005 
4006 static int
4007 dissect_dsarsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4008 {
4009   proto_item *it;
4010   proto_tree *dsarsp_tree;
4011   guint32 transid, response;
4012   tvbuff_t *next_tvb;
4013 
4014   it = proto_tree_add_item (tree, proto_docsis_dsarsp, tvb, 0, -1, ENC_NA);
4015   dsarsp_tree = proto_item_add_subtree (it, ett_docsis_dsarsp);
4016   proto_tree_add_item_ret_uint (dsarsp_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
4017   proto_tree_add_item_ret_uint (dsarsp_tree, hf_docsis_dsarsp_response, tvb, 2, 1, ENC_BIG_ENDIAN, &response);
4018 
4019   col_add_fstr (pinfo->cinfo, COL_INFO,
4020                 "Dynamic Service Add Response ID = %u (%s)", transid,
4021                 val_to_str_ext (response, &docsis_conf_code_ext, "%d"));
4022 
4023   /* Call dissector for Appendix C TLVs */
4024   next_tvb = tvb_new_subset_remaining (tvb, 3);
4025   call_dissector (docsis_tlv_handle, next_tvb, pinfo, dsarsp_tree);
4026   return tvb_captured_length(tvb);
4027 }
4028 
4029 static int
4030 dissect_dsaack (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4031 {
4032   proto_item *it;
4033   proto_tree *dsaack_tree;
4034   guint32 transid, response;
4035   tvbuff_t *next_tvb;
4036 
4037   it = proto_tree_add_item (tree, proto_docsis_dsaack, tvb, 0, -1, ENC_NA);
4038   dsaack_tree = proto_item_add_subtree (it, ett_docsis_dsaack);
4039   proto_tree_add_item_ret_uint (dsaack_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
4040   proto_tree_add_item_ret_uint (dsaack_tree, hf_docsis_dsaack_response, tvb, 2, 1, ENC_BIG_ENDIAN, &response);
4041 
4042   col_add_fstr (pinfo->cinfo, COL_INFO,
4043                 "Dynamic Service Add Acknowledge: Transaction ID = %u (%s)", transid,
4044                 val_to_str_ext (response, &docsis_conf_code_ext, "%d"));
4045 
4046   /* Call Dissector for Appendix C TLVs */
4047   next_tvb = tvb_new_subset_remaining (tvb, 3);
4048   call_dissector (docsis_tlv_handle, next_tvb, pinfo, dsaack_tree);
4049   return tvb_captured_length(tvb);
4050 }
4051 
4052 static int
4053 dissect_dscreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4054 {
4055   proto_item *it;
4056   proto_tree *dscreq_tree;
4057   guint32 transid;
4058   tvbuff_t *next_tvb;
4059 
4060   it = proto_tree_add_item (tree, proto_docsis_dscreq, tvb, 0, -1, ENC_NA);
4061   dscreq_tree = proto_item_add_subtree (it, ett_docsis_dscreq);
4062 
4063   proto_tree_add_item_ret_uint (dscreq_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
4064 
4065   col_add_fstr (pinfo->cinfo, COL_INFO,
4066                 "Dynamic Service Change Request: Transaction ID = %u", transid);
4067 
4068   /* Call dissector for Appendix C TLVs */
4069   next_tvb = tvb_new_subset_remaining (tvb, 2);
4070   call_dissector (docsis_tlv_handle, next_tvb, pinfo, dscreq_tree);
4071   return tvb_captured_length(tvb);
4072 }
4073 
4074 static int
4075 dissect_dscrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4076 {
4077   proto_item *it;
4078   proto_tree *dscrsp_tree;
4079   guint32 transid, response;
4080   tvbuff_t *next_tvb;
4081 
4082   it = proto_tree_add_item(tree, proto_docsis_dscrsp, tvb, 0, -1, ENC_NA);
4083   dscrsp_tree = proto_item_add_subtree (it, ett_docsis_dscrsp);
4084   proto_tree_add_item_ret_uint (dscrsp_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
4085   proto_tree_add_item_ret_uint (dscrsp_tree, hf_docsis_dscrsp_response, tvb, 2, 1, ENC_BIG_ENDIAN, &response);
4086 
4087   col_add_fstr (pinfo->cinfo, COL_INFO,
4088                 "Dynamic Service Change Response: Transaction ID = %u (%s)", transid,
4089                 val_to_str_ext (response, &docsis_conf_code_ext, "%d"));
4090 
4091   /* Call Dissector for Appendix C TLVs */
4092   next_tvb = tvb_new_subset_remaining (tvb, 3);
4093   call_dissector (docsis_tlv_handle, next_tvb, pinfo, dscrsp_tree);
4094   return tvb_captured_length(tvb);
4095 }
4096 
4097 static int
4098 dissect_dscack (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4099 {
4100   proto_item *it;
4101   proto_tree *dscack_tree;
4102   guint32 transid, response;
4103   tvbuff_t *next_tvb;
4104 
4105   it = proto_tree_add_item(tree, proto_docsis_dscack, tvb, 0, -1, ENC_NA);
4106   dscack_tree = proto_item_add_subtree (it, ett_docsis_dscack);
4107 
4108   proto_tree_add_item_ret_uint (dscack_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
4109   proto_tree_add_item_ret_uint (dscack_tree, hf_docsis_dscack_response, tvb, 2, 1, ENC_BIG_ENDIAN, &response);
4110 
4111   col_add_fstr (pinfo->cinfo, COL_INFO,
4112                 "Dynamic Service Change Acknowledge: Transaction ID = %u (%s)", transid,
4113                 val_to_str_ext (response, &docsis_conf_code_ext, "%d"));
4114 
4115   /* Call Dissector for Appendix C TLVs */
4116   next_tvb = tvb_new_subset_remaining (tvb, 3);
4117   call_dissector (docsis_tlv_handle, next_tvb, pinfo, dscack_tree);
4118   return tvb_captured_length(tvb);
4119 }
4120 
4121 static int
4122 dissect_dsdreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4123 {
4124   proto_item *it;
4125   proto_tree *dsdreq_tree;
4126   guint32 transid;
4127   tvbuff_t *next_tvb;
4128 
4129   it = proto_tree_add_item (tree, proto_docsis_dsdreq, tvb, 0, -1, ENC_NA);
4130   dsdreq_tree = proto_item_add_subtree (it, ett_docsis_dsdreq);
4131 
4132   proto_tree_add_item_ret_uint (dsdreq_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
4133 
4134   col_add_fstr (pinfo->cinfo, COL_INFO,
4135                 "Dynamic Service Delete Request: Transaction ID = %u", transid);
4136 
4137   proto_tree_add_item (dsdreq_tree, hf_docsis_dsdreq_rsvd, tvb, 2, 2, ENC_BIG_ENDIAN);
4138   proto_tree_add_item (dsdreq_tree, hf_docsis_dsdreq_sfid, tvb, 4, 4, ENC_BIG_ENDIAN);
4139 
4140   /* Call Dissector for Appendix C TLVs */
4141   next_tvb = tvb_new_subset_remaining (tvb, 8);
4142   call_dissector (docsis_tlv_handle, next_tvb, pinfo, dsdreq_tree);
4143   return tvb_captured_length(tvb);
4144 }
4145 
4146 static int
4147 dissect_dsdrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4148 {
4149   proto_item *it;
4150   proto_tree *dsdrsp_tree;
4151   guint32 tranid, confcode;
4152 
4153   it = proto_tree_add_item(tree, proto_docsis_dsdrsp, tvb, 0, -1, ENC_NA);
4154   dsdrsp_tree = proto_item_add_subtree (it, ett_docsis_dsdrsp);
4155   proto_tree_add_item_ret_uint (dsdrsp_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &tranid);
4156   proto_tree_add_item_ret_uint (dsdrsp_tree, hf_docsis_dsdrsp_confcode, tvb, 2, 1, ENC_BIG_ENDIAN, &confcode);
4157   proto_tree_add_item (dsdrsp_tree, hf_docsis_dsdrsp_rsvd, tvb, 3, 1, ENC_BIG_ENDIAN);
4158 
4159   col_add_fstr (pinfo->cinfo, COL_INFO,
4160                 "Dynamic Service Delete Response: Transaction ID = %u (%s)",
4161                 tranid, val_to_str_ext (confcode, &docsis_conf_code_ext, "%d"));
4162 
4163   return tvb_captured_length(tvb);
4164 }
4165 
4166 static void
4167 dissect_dccreq_ds_params (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len)
4168 {
4169   guint8 type;
4170   guint32 length;
4171   proto_tree *dcc_tree;
4172   proto_item *dcc_item, *tlv_len_item;
4173   int pos;
4174 
4175   pos = start;
4176   while ( pos < ( start + len) )
4177   {
4178     type = tvb_get_guint8 (tvb, pos);
4179     dcc_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
4180                                             ett_docsis_dccreq_ds_params, &dcc_item,
4181                                             val_to_str(type, ds_param_subtlv_vals,
4182                                                        "Unknown TLV (%u)"));
4183     proto_tree_add_uint (dcc_tree, hf_docsis_dcc_ds_params_subtype, tvb, pos, 1, type);
4184     pos++;
4185     tlv_len_item = proto_tree_add_item_ret_uint (dcc_tree, hf_docsis_dcc_ds_params_length, tvb, pos, 1, ENC_NA, &length);
4186     pos++;
4187     proto_item_set_len(dcc_item, length + 2);
4188 
4189     switch (type)
4190     {
4191     case DCCREQ_DS_FREQ:
4192       if (length == 4)
4193       {
4194         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_ds_freq, tvb, pos, length, ENC_BIG_ENDIAN);
4195       }
4196       else
4197       {
4198         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4199       }
4200       break;
4201     case DCCREQ_DS_MOD_TYPE:
4202       if (length == 1)
4203       {
4204         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_ds_mod_type, tvb, pos, length, ENC_BIG_ENDIAN);
4205       }
4206       else
4207       {
4208         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4209       }
4210       break;
4211     case DCCREQ_DS_SYM_RATE:
4212       if (length == 1)
4213       {
4214         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_ds_sym_rate, tvb, pos, length, ENC_BIG_ENDIAN);
4215       }
4216       else
4217       {
4218         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4219       }
4220       break;
4221     case DCCREQ_DS_INTLV_DEPTH:
4222       if (length == 2)
4223       {
4224         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_ds_intlv_depth_i, tvb, pos, 1, ENC_BIG_ENDIAN);
4225         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_ds_intlv_depth_j, tvb, pos + 1, 1, ENC_BIG_ENDIAN);
4226       }
4227       else
4228       {
4229         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4230       }
4231       break;
4232     case DCCREQ_DS_CHAN_ID:
4233       if (length == 1)
4234       {
4235         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_ds_chan_id, tvb, pos, length, ENC_BIG_ENDIAN);
4236       }
4237       else
4238       {
4239         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4240       }
4241       break;
4242     case DCCREQ_DS_SYNC_SUB:
4243       if (length == 1)
4244       {
4245         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_ds_sync_sub, tvb, pos, length, ENC_BIG_ENDIAN);
4246       }
4247       else
4248       {
4249         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4250       }
4251       break;
4252     case DCCREQ_DS_OFDM_BLOCK_FREQ:
4253       if (length == 4)
4254       {
4255         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_ds_ofdm_block_freq, tvb, pos, length, ENC_BIG_ENDIAN);
4256       }
4257       else
4258       {
4259         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4260       }
4261       break;
4262     }
4263 
4264     pos += length;
4265   }
4266 }
4267 
4268 static void
4269 dissect_dccreq_sf_sub (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len)
4270 {
4271   guint8 type;
4272   guint32 length;
4273   proto_tree *dcc_tree;
4274   proto_item *dcc_item, *tlv_len_item;
4275   int pos;
4276 
4277   pos = start;
4278   while ( pos < ( start + len) )
4279   {
4280     type = tvb_get_guint8 (tvb, pos);
4281     dcc_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
4282                                             ett_docsis_dccreq_sf_sub, &dcc_item,
4283                                             val_to_str(type, sf_sub_subtlv_vals,
4284                                                        "Unknown TLV (%u)"));
4285     proto_tree_add_uint (dcc_tree, hf_docsis_dcc_sf_sub_subtype, tvb, pos, 1, type);
4286     pos++;
4287     tlv_len_item = proto_tree_add_item_ret_uint (dcc_tree, hf_docsis_dcc_sf_sub_length, tvb, pos, 1, ENC_NA, &length);
4288     pos++;
4289     proto_item_set_len(dcc_item, length + 2);
4290 
4291     switch (type)
4292     {
4293     case DCCREQ_SF_SFID:
4294       if (length == 8)
4295       {
4296         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_sf_sfid_cur, tvb, pos, 4, ENC_BIG_ENDIAN);
4297         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_sf_sfid_new, tvb, pos + 4, 4, ENC_BIG_ENDIAN);
4298       }
4299       else
4300       {
4301         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4302       }
4303       break;
4304     case DCCREQ_SF_SID:
4305       if (length == 4)
4306       {
4307         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_sf_sid_cur, tvb, pos, 2, ENC_BIG_ENDIAN);
4308         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_sf_sid_new, tvb, pos + 2, 2, ENC_BIG_ENDIAN);
4309       }
4310       else
4311       {
4312         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4313       }
4314       break;
4315     case DCCREQ_SF_UNSOL_GRANT_TREF:
4316       if (length == 4)
4317       {
4318         proto_tree_add_item (dcc_tree, hf_docsis_dccreq_sf_unsol_grant_tref, tvb, pos, length, ENC_BIG_ENDIAN);
4319       }
4320       else
4321       {
4322         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4323       }
4324       break;
4325     }
4326 
4327     pos += length;
4328   }
4329 }
4330 
4331 static int
4332 dissect_dccreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4333 {
4334   guint16 pos;
4335   guint8 type;
4336   guint32 length;
4337   proto_tree *dcc_tree, *tlv_tree;
4338   proto_item *dcc_item, *tlv_item, *tlv_len_item;
4339 
4340   col_set_str(pinfo->cinfo, COL_INFO, "DCC-REQ Message");
4341 
4342   dcc_item = proto_tree_add_item (tree, proto_docsis_dccreq, tvb, 0, -1, ENC_NA);
4343   dcc_tree = proto_item_add_subtree (dcc_item, ett_docsis_dccreq);
4344 
4345   proto_tree_add_item (dcc_tree, hf_docsis_dccreq_tran_id, tvb, 0, 2, ENC_BIG_ENDIAN);
4346 
4347   pos = 2;
4348   while (tvb_reported_length_remaining(tvb, pos) > 0)
4349   {
4350     type = tvb_get_guint8 (tvb, pos);
4351     tlv_tree = proto_tree_add_subtree(dcc_tree, tvb, pos, -1,
4352                                             ett_docsis_dccreq_tlv, &tlv_item,
4353                                             val_to_str(type, dcc_tlv_vals,
4354                                                        "Unknown TLV (%u)"));
4355     proto_tree_add_uint (tlv_tree, hf_docsis_dccreq_type, tvb, pos, 1, type);
4356     pos++;
4357     tlv_len_item = proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_dccreq_length, tvb, pos, 1, ENC_NA, &length);
4358     pos++;
4359     proto_item_set_len(tlv_item, length + 2);
4360 
4361     switch (type)
4362     {
4363     case DCCREQ_UP_CHAN_ID:
4364       if (length == 1)
4365       {
4366         proto_tree_add_item (tlv_tree, hf_docsis_dccreq_up_chan_id, tvb, pos, length, ENC_BIG_ENDIAN);
4367       }
4368       else
4369       {
4370         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4371       }
4372       break;
4373     case DCCREQ_DS_PARAMS:
4374       dissect_dccreq_ds_params (tvb, pinfo, tlv_tree, pos, length);
4375       break;
4376     case DCCREQ_INIT_TECH:
4377       if (length == 1)
4378       {
4379         proto_tree_add_item (tlv_tree, hf_docsis_dccreq_init_tech, tvb, pos, length, ENC_BIG_ENDIAN);
4380       }
4381       else
4382       {
4383         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4384       }
4385       break;
4386     case DCCREQ_UCD_SUB:
4387       proto_tree_add_item (tlv_tree, hf_docsis_dccreq_ucd_sub, tvb, pos, length, ENC_NA);
4388       break;
4389     case DCCREQ_SAID_SUB:
4390       if (length == 4)
4391       {
4392         proto_tree_add_item (tlv_tree, hf_docsis_dccreq_said_sub_cur, tvb, pos, 2, ENC_BIG_ENDIAN);
4393         proto_tree_add_item (tlv_tree, hf_docsis_dccreq_said_sub_new, tvb, pos + 2, 2, ENC_BIG_ENDIAN);
4394       }
4395       else
4396       {
4397         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4398       }
4399       break;
4400     case DCCREQ_SF_SUB:
4401       dissect_dccreq_sf_sub (tvb, pinfo, tlv_tree, pos, length );
4402       break;
4403     case DCCREQ_CMTS_MAC_ADDR:
4404       if (length == 6)
4405       {
4406         proto_tree_add_item (tlv_tree, hf_docsis_dccreq_cmts_mac_addr, tvb, pos, length, ENC_NA);
4407       }
4408       else
4409       {
4410         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4411       }
4412       break;
4413     case DCCREQ_KEY_SEQ_NUM:
4414       if (length == 1)
4415       {
4416         proto_tree_add_item (tlv_tree, hf_docsis_dccreq_key_seq_num, tvb, pos, length, ENC_BIG_ENDIAN);
4417       }
4418       else
4419       {
4420         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4421       }
4422       break;
4423     case DCCREQ_HMAC_DIGEST:
4424       if (length == 20)
4425       {
4426         proto_tree_add_item (tlv_tree, hf_docsis_dccreq_hmac_digest, tvb, pos, length, ENC_NA);
4427       }
4428       else
4429       {
4430         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4431       }
4432       break;
4433     }       /* switch(type) */
4434     pos += length;
4435   }         /* (tvb_reported_length_remaining(tvb, pos) > 0) */
4436   return tvb_captured_length(tvb);
4437 }
4438 
4439 static void
4440 dissect_dccrsp_cm_jump_time (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len)
4441 {
4442   guint8 type;
4443   guint32 length;
4444   proto_tree *dcc_tree;
4445   proto_item *dcc_item, *tlv_len_item;
4446   int pos;
4447 
4448   pos = start;
4449   while ( pos < ( start + len) )
4450   {
4451     type = tvb_get_guint8 (tvb, pos);
4452     dcc_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
4453                                             ett_docsis_dccrsp_cm_jump_time, &dcc_item,
4454                                             val_to_str(type, cm_jump_subtlv_vals,
4455                                                        "Unknown TLV (%u)"));
4456     proto_tree_add_uint (dcc_tree, hf_docsis_dcc_cm_jump_subtype, tvb, pos, 1, type);
4457     pos++;
4458     tlv_len_item = proto_tree_add_item_ret_uint (dcc_tree, hf_docsis_dcc_cm_jump_length, tvb, pos, 1, ENC_NA, &length);
4459     pos++;
4460     proto_item_set_len(dcc_item, length + 2);
4461 
4462     switch (type)
4463     {
4464     case DCCRSP_CM_JUMP_TIME_LENGTH:
4465       if (length == 4)
4466       {
4467         proto_tree_add_item (dcc_tree, hf_docsis_dccrsp_cm_jump_time_length, tvb, pos, length, ENC_BIG_ENDIAN);
4468       }
4469       else
4470       {
4471         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4472       }
4473       break;
4474     case DCCRSP_CM_JUMP_TIME_START:
4475       if (length == 8)
4476       {
4477         proto_tree_add_item (dcc_tree, hf_docsis_dccrsp_cm_jump_time_start, tvb, pos, length, ENC_BIG_ENDIAN);
4478       }
4479       else
4480       {
4481         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4482       }
4483       break;
4484     }
4485 
4486     pos += length;
4487   }
4488 }
4489 
4490 static int
4491 dissect_dccrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4492 {
4493   guint16 pos;
4494   guint8 type;
4495   guint32 length;
4496   proto_tree *dcc_tree, *tlv_tree;
4497   proto_item *dcc_item, *tlv_item, *tlv_len_item;
4498 
4499   col_set_str(pinfo->cinfo, COL_INFO, "DCC-RSP Message");
4500 
4501   dcc_item = proto_tree_add_item (tree, proto_docsis_dccrsp, tvb, 0, -1, ENC_NA);
4502   dcc_tree = proto_item_add_subtree (dcc_item, ett_docsis_dccrsp);
4503   proto_tree_add_item (dcc_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN);
4504   proto_tree_add_item (dcc_tree, hf_docsis_dccrsp_conf_code, tvb, 2, 1, ENC_BIG_ENDIAN);
4505 
4506   pos = 3;
4507   while (tvb_reported_length_remaining(tvb, pos) > 0)
4508   {
4509     type = tvb_get_guint8 (tvb, pos);
4510     tlv_tree = proto_tree_add_subtree(dcc_tree, tvb, pos, -1,
4511                                             ett_docsis_dccrsp_tlv, &tlv_item,
4512                                             val_to_str(type, dccrsp_tlv_vals,
4513                                                        "Unknown TLV (%u)"));
4514     proto_tree_add_uint (tlv_tree, hf_docsis_dccrsp_type, tvb, pos, 1, type);
4515     pos++;
4516     tlv_len_item = proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_dccrsp_length, tvb, pos, 1, ENC_NA, &length);
4517     pos++;
4518     proto_item_set_len(tlv_item, length + 2);
4519 
4520     switch (type)
4521     {
4522     case DCCRSP_CM_JUMP_TIME:
4523       dissect_dccrsp_cm_jump_time (tvb, pinfo, tlv_tree, pos, length );
4524       break;
4525     case DCCRSP_KEY_SEQ_NUM:
4526       if (length == 1)
4527       {
4528         proto_tree_add_item (tlv_tree, hf_docsis_dccrsp_key_seq_num, tvb, pos, length, ENC_BIG_ENDIAN);
4529       }
4530       else
4531       {
4532         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4533       }
4534       break;
4535     case DCCRSP_HMAC_DIGEST:
4536       if (length == 20)
4537       {
4538         proto_tree_add_item (tlv_tree, hf_docsis_dccrsp_hmac_digest, tvb, pos, length, ENC_NA);
4539       }
4540       else
4541       {
4542         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4543       }
4544       break;
4545     }      /* switch(type) */
4546 
4547     pos += length;
4548   }       /* while (tvb_reported_length_remaining(tvb, pos) > 0) */
4549 
4550   return tvb_captured_length(tvb);
4551 }
4552 
4553 static int
4554 dissect_dccack (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4555 {
4556   guint16 pos;
4557   guint8 type;
4558   guint32 length;
4559   proto_tree *dcc_tree, *tlv_tree;
4560   proto_item *dcc_item, *tlv_item, *tlv_len_item;
4561 
4562   col_set_str(pinfo->cinfo, COL_INFO, "DCC-ACK Message");
4563 
4564   dcc_item = proto_tree_add_item(tree, proto_docsis_dccack, tvb, 0, -1, ENC_NA);
4565   dcc_tree = proto_item_add_subtree (dcc_item, ett_docsis_dccack);
4566   proto_tree_add_item (dcc_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN);
4567 
4568   pos = 2;
4569   while (tvb_reported_length_remaining(tvb, pos) > 0)
4570   {
4571     type = tvb_get_guint8 (tvb, pos);
4572     tlv_tree = proto_tree_add_subtree(dcc_tree, tvb, pos, -1,
4573                                             ett_docsis_dccack_tlv, &tlv_item,
4574                                             val_to_str(type, dccack_tlv_vals,
4575                                                        "Unknown TLV (%u)"));
4576     proto_tree_add_uint (tlv_tree, hf_docsis_dccack_type, tvb, pos, 1, type);
4577     pos++;
4578     tlv_len_item = proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_dccack_length, tvb, pos, 1, ENC_NA, &length);
4579     pos++;
4580     proto_item_set_len(tlv_item, length + 2);
4581 
4582     switch (type)
4583     {
4584     case DCCACK_KEY_SEQ_NUM:
4585       if (length == 1)
4586       {
4587         proto_tree_add_item (tlv_tree, hf_docsis_dccack_key_seq_num, tvb, pos, length, ENC_BIG_ENDIAN);
4588       }
4589       else
4590       {
4591         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4592       }
4593       break;
4594     case DCCACK_HMAC_DIGEST:
4595       if (length == 20)
4596       {
4597         proto_tree_add_item (tlv_tree, hf_docsis_dccack_hmac_digest, tvb, pos, length, ENC_NA);
4598       }
4599       else
4600       {
4601         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4602       }
4603       break;
4604     }      /* switch(type) */
4605 
4606     pos += length;
4607   }        /*   while (tvb_reported_length_remaining(tvb, pos) > 0) */
4608 
4609   return tvb_captured_length(tvb);
4610 }
4611 
4612 static int
4613 dissect_type29ucd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4614 {
4615   return dissect_any_ucd(tvb, pinfo, tree, proto_docsis_type29ucd, MGT_TYPE29UCD);
4616 }
4617 
4618 static int
4619 dissect_intrngreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
4620 {
4621   proto_item *intrngreq_item;
4622   proto_tree *intrngreq_tree;
4623   guint32 sid;
4624 
4625   intrngreq_item = proto_tree_add_item(tree, proto_docsis_intrngreq, tvb, 0, -1, ENC_NA);
4626   intrngreq_tree = proto_item_add_subtree (intrngreq_item, ett_docsis_intrngreq);
4627 
4628   proto_tree_add_item_ret_uint (intrngreq_tree, hf_docsis_intrngreq_sid, tvb, 0, 2, ENC_BIG_ENDIAN, &sid);
4629   col_add_fstr (pinfo->cinfo, COL_INFO, "Initial Ranging Request: SID = %u",sid);
4630 
4631   proto_tree_add_item (intrngreq_tree, hf_docsis_mgt_down_chid, tvb, 2, 1, ENC_BIG_ENDIAN);
4632   proto_tree_add_item (intrngreq_tree, hf_docsis_mgt_upstream_chid, tvb, 3, 1, ENC_BIG_ENDIAN);
4633 
4634   return tvb_captured_length(tvb);
4635 }
4636 
4637 static void
4638 dissect_dcd_dsg_cfg (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len)
4639 {
4640   guint8 type;
4641   guint32 length;
4642   proto_tree *dcd_tree;
4643   proto_tree *dcd_item, *tlv_len_item;
4644   int pos;
4645 
4646   pos = start;
4647   while ( pos < ( start + len) )
4648   {
4649     type = tvb_get_guint8 (tvb, pos);
4650     dcd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
4651                                             ett_docsis_dcd_cfg, &dcd_item,
4652                                             val_to_str(type, dcd_cfg_vals,
4653                                                        "Unknown TLV (%u)"));
4654     proto_tree_add_uint (dcd_tree, hf_docsis_dcd_cfg_subtype, tvb, pos, 1, type);
4655     pos++;
4656     tlv_len_item = proto_tree_add_item_ret_uint (dcd_tree, hf_docsis_dcd_cfg_length, tvb, pos, 1, ENC_NA, &length);
4657     pos++;
4658     proto_item_set_len(dcd_item, length + 2);
4659 
4660     switch (type)
4661     {
4662     case DCD_CFG_CHAN_LST:
4663       if (length == 4)
4664       {
4665         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfg_chan, tvb, pos, length, ENC_BIG_ENDIAN);
4666       }
4667       else
4668       {
4669         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4670       }
4671       break;
4672     case DCD_CFG_TDSG1:
4673       if (length == 2)
4674       {
4675         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfg_tdsg1, tvb, pos, length, ENC_BIG_ENDIAN);
4676       }
4677       else
4678       {
4679         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4680       }
4681       break;
4682     case DCD_CFG_TDSG2:
4683       if (length == 2)
4684       {
4685         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfg_tdsg2, tvb, pos, length, ENC_BIG_ENDIAN);
4686       }
4687       else
4688       {
4689         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4690       }
4691       break;
4692     case DCD_CFG_TDSG3:
4693       if (length == 2)
4694       {
4695         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfg_tdsg3, tvb, pos, length, ENC_BIG_ENDIAN);
4696       }
4697       else
4698       {
4699         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4700       }
4701       break;
4702     case DCD_CFG_TDSG4:
4703       if (length == 2)
4704       {
4705         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfg_tdsg4, tvb, pos, length, ENC_BIG_ENDIAN);
4706       }
4707       else
4708       {
4709         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4710       }
4711       break;
4712     case DCD_CFG_VENDOR_SPEC:
4713       proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfg_vendor_spec, tvb, pos, length, ENC_NA);
4714       break;
4715 
4716     }
4717 
4718     pos += length;
4719   }
4720 }
4721 
4722 static void
4723 dissect_dcd_down_classifier_ip (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len)
4724 {
4725   guint8 type;
4726   guint32 length;
4727   proto_tree *dcd_tree;
4728   proto_tree *dcd_item, *tlv_len_item;
4729   int pos;
4730 
4731   pos = start;
4732   while ( pos < ( start + len) )
4733   {
4734     type = tvb_get_guint8 (tvb, pos);
4735     dcd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
4736                                             ett_docsis_dcd_cfr_ip, &dcd_item,
4737                                             val_to_str(type, dcd_cfr_ip_vals,
4738                                                        "Unknown TLV (%u)"));
4739     proto_tree_add_uint (dcd_tree, hf_docsis_dcd_cfr_ip_subtype, tvb, pos, 1, type);
4740     pos++;
4741     tlv_len_item = proto_tree_add_item_ret_uint (dcd_tree, hf_docsis_dcd_cfr_ip_length, tvb, pos, 1, ENC_NA, &length);
4742     pos++;
4743     proto_item_set_len(dcd_item, length + 2);
4744 
4745     switch (type)
4746     {
4747     case DCD_CFR_IP_SOURCE_ADDR:
4748       if (length == 4)
4749       {
4750         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_ip_source_addr, tvb, pos, length, ENC_BIG_ENDIAN);
4751       }
4752       else
4753       {
4754         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4755       }
4756       break;
4757     case DCD_CFR_IP_SOURCE_MASK:
4758       if (length == 4)
4759       {
4760         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_ip_source_mask, tvb, pos, length, ENC_BIG_ENDIAN);
4761       }
4762       else
4763       {
4764         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4765       }
4766       break;
4767     case DCD_CFR_IP_DEST_ADDR:
4768       if (length == 4)
4769       {
4770         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_ip_dest_addr, tvb, pos, length, ENC_BIG_ENDIAN);
4771       }
4772       else
4773       {
4774         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4775       }
4776       break;
4777     case DCD_CFR_IP_DEST_MASK:
4778       if (length == 4)
4779       {
4780         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_ip_dest_mask, tvb, pos, length, ENC_BIG_ENDIAN);
4781       }
4782       else
4783       {
4784         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4785       }
4786       break;
4787     case DCD_CFR_TCPUDP_SRCPORT_START:
4788       if (length == 2)
4789       {
4790         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_tcpudp_srcport_start, tvb, pos, length, ENC_BIG_ENDIAN);
4791       }
4792       else
4793       {
4794         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4795       }
4796       break;
4797     case DCD_CFR_TCPUDP_SRCPORT_END:
4798       if (length == 2)
4799       {
4800         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_tcpudp_srcport_end, tvb, pos, length, ENC_BIG_ENDIAN);
4801       }
4802       else
4803       {
4804         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4805       }
4806       break;
4807     case DCD_CFR_TCPUDP_DSTPORT_START:
4808       if (length == 2)
4809       {
4810         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_tcpudp_dstport_start, tvb, pos, length, ENC_BIG_ENDIAN);
4811       }
4812       else
4813       {
4814         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4815       }
4816       break;
4817     case DCD_CFR_TCPUDP_DSTPORT_END:
4818       if (length == 2)
4819       {
4820         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_tcpudp_dstport_end, tvb, pos, length, ENC_BIG_ENDIAN);
4821       }
4822       else
4823       {
4824         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4825       }
4826       break;
4827     }
4828 
4829     pos += length;
4830   }
4831 }
4832 
4833 static void
4834 dissect_dcd_clid (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len)
4835 {
4836   guint8 type;
4837   guint32 length;
4838   proto_tree *dcd_tree;
4839   proto_tree *dcd_item, *tlv_len_item;
4840   int pos;
4841 
4842   pos = start;
4843   while ( pos < ( start + len) )
4844   {
4845     type = tvb_get_guint8 (tvb, pos);
4846     dcd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
4847                                             ett_docsis_dcd_clid, &dcd_item,
4848                                             val_to_str(type, dcd_clid_vals,
4849                                                        "Unknown TLV (%u)"));
4850     proto_tree_add_uint (dcd_tree, hf_docsis_dcd_clid_subtype, tvb, pos, 1, type);
4851     pos++;
4852     tlv_len_item = proto_tree_add_item_ret_uint (dcd_tree, hf_docsis_dcd_clid_length, tvb, pos, 1, ENC_NA, &length);
4853     pos++;
4854     proto_item_set_len(dcd_item, length + 2);
4855 
4856     switch (type)
4857     {
4858     case DCD_CLID_BCAST_ID:
4859       if (length == 2)
4860       {
4861         proto_tree_add_item(dcd_tree, hf_docsis_dcd_clid_bcast_id, tvb, pos, length, ENC_BIG_ENDIAN);
4862       }
4863       else
4864       {
4865         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4866       }
4867       break;
4868     case DCD_CLID_KNOWN_MAC_ADDR:
4869       if (length == 6)
4870       {
4871        proto_tree_add_item (dcd_tree, hf_docsis_dcd_clid_known_mac_addr, tvb, pos, length, ENC_NA);
4872       }
4873       else
4874       {
4875         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4876       }
4877       break;
4878     case DCD_CLID_CA_SYS_ID:
4879       if (length == 2)
4880       {
4881         proto_tree_add_item (dcd_tree, hf_docsis_dcd_clid_ca_sys_id, tvb, pos, length, ENC_BIG_ENDIAN);
4882       }
4883       else
4884       {
4885         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4886       }
4887       break;
4888     case DCD_CLID_APP_ID:
4889       if (length == 2)
4890       {
4891         proto_tree_add_item (dcd_tree, hf_docsis_dcd_clid_app_id, tvb, pos, length, ENC_BIG_ENDIAN);
4892       }
4893       else
4894       {
4895         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4896       }
4897       break;
4898     }
4899 
4900     pos += length;
4901   }
4902 }
4903 
4904 static void
4905 dissect_dcd_dsg_rule (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len)
4906 {
4907   guint8 type;
4908   guint32 length;
4909   proto_tree *dcd_tree;
4910   proto_tree *dcd_item, *tlv_len_item;
4911   int pos;
4912 
4913   pos = start;
4914   while ( pos < ( start + len) )
4915   {
4916     type = tvb_get_guint8 (tvb, pos);
4917     dcd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
4918                                             ett_docsis_dcd_rule, &dcd_item,
4919                                             val_to_str(type, dcd_dsg_rule_vals,
4920                                                        "Unknown TLV (%u)"));
4921     proto_tree_add_uint (dcd_tree, hf_docsis_dcd_dsg_rule_subtype, tvb, pos, 1, type);
4922     pos++;
4923     tlv_len_item = proto_tree_add_item_ret_uint (dcd_tree, hf_docsis_dcd_dsg_rule_length, tvb, pos, 1, ENC_NA, &length);
4924     pos++;
4925     proto_item_set_len(dcd_item, length + 2);
4926 
4927     switch (type)
4928     {
4929     case DCD_RULE_ID:
4930       if (length == 1)
4931       {
4932         proto_tree_add_item (dcd_tree, hf_docsis_dcd_rule_id, tvb, pos, length, ENC_BIG_ENDIAN);
4933       }
4934       else
4935       {
4936         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4937       }
4938       break;
4939     case DCD_RULE_PRI:
4940       if (length == 1)
4941       {
4942         proto_tree_add_item (dcd_tree, hf_docsis_dcd_rule_pri, tvb, pos, length, ENC_BIG_ENDIAN);
4943       }
4944       else
4945       {
4946         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4947       }
4948       break;
4949     case DCD_RULE_UCID_RNG:
4950       proto_tree_add_item (dcd_tree, hf_docsis_dcd_rule_ucid_list, tvb, pos, length, ENC_NA);
4951       break;
4952     case DCD_RULE_CLIENT_ID:
4953       dissect_dcd_clid (tvb, pinfo, dcd_tree, pos, length );
4954       break;
4955     case DCD_RULE_TUNL_ADDR:
4956       if (length == 6)
4957       {
4958         proto_tree_add_item (dcd_tree, hf_docsis_dcd_rule_tunl_addr, tvb, pos, length, ENC_NA);
4959       }
4960       else
4961       {
4962         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4963       }
4964       break;
4965     case DCD_RULE_CFR_ID:
4966       if (length == 2)
4967       {
4968         proto_tree_add_item (dcd_tree, hf_docsis_dcd_rule_cfr_id, tvb, pos, length, ENC_BIG_ENDIAN);
4969       }
4970       else
4971       {
4972         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
4973       }
4974       break;
4975     case DCD_RULE_VENDOR_SPEC:
4976       proto_tree_add_item (dcd_tree, hf_docsis_dcd_rule_vendor_spec, tvb, pos, length, ENC_NA);
4977       break;
4978 
4979     }
4980 
4981     pos += length;
4982   }
4983 }
4984 
4985 static void
4986 dissect_dcd_down_classifier (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, int start, guint16 len)
4987 {
4988   guint8 type;
4989   guint32 length;
4990   proto_tree *dcd_tree;
4991   proto_tree *dcd_item, *tlv_len_item;
4992   int pos;
4993 
4994   pos = start;
4995   while ( pos < ( start + len) )
4996   {
4997     type = tvb_get_guint8 (tvb, pos);
4998     dcd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
4999                                             ett_docsis_dcd_cfr, &dcd_item,
5000                                             val_to_str(type, dcd_down_classifier_vals,
5001                                                        "Unknown TLV (%u)"));
5002     proto_tree_add_uint (dcd_tree, hf_docsis_dcd_down_classifier_subtype, tvb, pos, 1, type);
5003     pos++;
5004     tlv_len_item = proto_tree_add_item_ret_uint (dcd_tree, hf_docsis_dcd_down_classifier_length, tvb, pos, 1, ENC_NA, &length);
5005     pos++;
5006     proto_item_set_len(dcd_item, length + 2);
5007 
5008     switch (type)
5009     {
5010     case DCD_CFR_ID:
5011       if (length == 2)
5012       {
5013         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_id, tvb, pos, length, ENC_BIG_ENDIAN);
5014       }
5015       else
5016       {
5017         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5018       }
5019       break;
5020     case DCD_CFR_RULE_PRI:
5021       if (length == 1)
5022       {
5023         proto_tree_add_item (dcd_tree, hf_docsis_dcd_cfr_rule_pri, tvb, pos, length, ENC_BIG_ENDIAN);
5024       }
5025       else
5026       {
5027         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5028       }
5029       break;
5030     case DCD_CFR_IP_CLASSIFIER:
5031       dissect_dcd_down_classifier_ip (tvb , pinfo , dcd_tree , pos , length );
5032       break;
5033     }
5034 
5035     pos += length;
5036   }
5037 }
5038 
5039 static int
5040 dissect_dcd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5041 {
5042   guint16 pos;
5043   guint8 type;
5044   guint32 length;
5045   proto_tree *dcd_tree, *tlv_tree;
5046   proto_item *dcd_item, *tlv_item;
5047 
5048   col_set_str(pinfo->cinfo, COL_INFO, "DCD Message: ");
5049 
5050   dcd_item = proto_tree_add_item(tree, proto_docsis_dcd, tvb, 0, -1, ENC_NA);
5051   dcd_tree = proto_item_add_subtree (dcd_item, ett_docsis_dcd);
5052   proto_tree_add_item (dcd_tree, hf_docsis_dcd_config_ch_cnt, tvb, 0, 1, ENC_BIG_ENDIAN);
5053   proto_tree_add_item (dcd_tree, hf_docsis_dcd_num_of_frag, tvb, 1, 1, ENC_BIG_ENDIAN);
5054   proto_tree_add_item (dcd_tree, hf_docsis_dcd_frag_sequence_num, tvb, 2, 1, ENC_BIG_ENDIAN);
5055 
5056   pos = 3;
5057   while (tvb_reported_length_remaining(tvb, pos) > 0)
5058   {
5059     type = tvb_get_guint8 (tvb, pos);
5060     tlv_tree = proto_tree_add_subtree(dcd_tree, tvb, pos, -1,
5061                                             ett_docsis_dcd_tlv, &tlv_item,
5062                                             val_to_str(type, dcd_tlv_vals,
5063                                                        "Unknown TLV (%u)"));
5064     proto_tree_add_uint (tlv_tree, hf_docsis_dcd_type, tvb, pos, 1, type);
5065     pos++;
5066     proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_dcd_length, tvb, pos, 1, ENC_NA, &length);
5067     pos++;
5068     proto_item_set_len(tlv_item, length + 2);
5069 
5070     switch (type)
5071     {
5072     case DCD_DOWN_CLASSIFIER:
5073       dissect_dcd_down_classifier (tvb, pinfo, tlv_tree, pos, length);
5074       break;
5075     case DCD_DSG_RULE:
5076       dissect_dcd_dsg_rule (tvb, pinfo, tlv_tree, pos, length);
5077       break;
5078     case DCD_DSG_CONFIG:
5079       dissect_dcd_dsg_cfg (tvb, pinfo, tlv_tree, pos, length);
5080       break;
5081     }     /* switch(type) */
5082 
5083      pos += length;
5084   }       /* while (tvb_reported_length_remaining(tvb, pos) > 0) */
5085 
5086   return tvb_captured_length(tvb);
5087 }
5088 
5089 static void
5090 dissect_mdd_ds_active_channel_list(tvbuff_t * tvb, packet_info* pinfo _U_, proto_tree * tree, int start, guint16 len)
5091 {
5092   guint8 type;
5093   guint32 length;
5094   proto_tree *mdd_tree;
5095   proto_item *mdd_item;
5096   int pos;
5097   static int * const order_annex[] = {
5098     &hf_docsis_mdd_downstream_active_channel_list_modulation_order,
5099     &hf_docsis_mdd_downstream_active_channel_list_annex,
5100     NULL
5101   };
5102   static int * const cm_status_event[] = {
5103     &hf_docsis_mdd_cm_status_event_enable_bitmask_mdd_timeout,
5104     &hf_docsis_mdd_cm_status_event_enable_bitmask_qam_fec_lock_failure,
5105     &hf_docsis_mdd_cm_status_event_enable_bitmask_mdd_recovery,
5106     &hf_docsis_mdd_cm_status_event_enable_bitmask_qam_fec_lock_recovery,
5107     NULL
5108   };
5109   static int * const ofdm_plc_parameters[] = {
5110     &hf_docsis_mdd_ofdm_plc_parameters_tukey_raised_cosine_window,
5111     &hf_docsis_mdd_ofdm_plc_parameters_cyclic_prefix,
5112     &hf_docsis_mdd_ofdm_plc_parameters_sub_carrier_spacing,
5113     NULL
5114   };
5115 
5116   pos = start;
5117   while ( pos < ( start + len) )
5118   {
5119     type = tvb_get_guint8 (tvb, pos);
5120     mdd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
5121                                             ett_docsis_mdd_ds_active_channel_list, &mdd_item,
5122                                             val_to_str(type, mdd_ds_active_channel_list_vals,
5123                                                        "Unknown TLV (%u)"));
5124     proto_tree_add_uint (mdd_tree, hf_docsis_mdd_ds_active_channel_list_subtype, tvb, pos, 1, type);
5125     pos++;
5126     proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_ds_active_channel_list_length, tvb, pos, 1, ENC_NA, &length);
5127     pos++;
5128     proto_item_set_len(mdd_item, length + 2);
5129 
5130     switch(type)
5131     {
5132     case DOWNSTREAM_ACTIVE_CHANNEL_LIST_CHANNEL_ID:
5133       proto_tree_add_item (mdd_tree, hf_docsis_mdd_downstream_active_channel_list_channel_id, tvb, pos, 1, ENC_BIG_ENDIAN);
5134       break;
5135     case DOWNSTREAM_ACTIVE_CHANNEL_LIST_FREQUENCY:
5136       proto_tree_add_item (mdd_tree, hf_docsis_mdd_downstream_active_channel_list_frequency, tvb, pos, 4, ENC_BIG_ENDIAN);
5137       break;
5138     case DOWNSTREAM_ACTIVE_CHANNEL_LIST_MODULATION_ORDER_ANNEX:
5139       proto_tree_add_bitmask_list(mdd_tree, tvb, pos, 1, order_annex, ENC_BIG_ENDIAN);
5140       break;
5141     case DOWNSTREAM_ACTIVE_CHANNEL_LIST_PRIMARY_CAPABLE:
5142       proto_tree_add_item (mdd_tree, hf_docsis_mdd_downstream_active_channel_list_primary_capable, tvb, pos, 1, ENC_BIG_ENDIAN);
5143       break;
5144     case DOWNSTREAM_ACTIVE_CHANNEL_LIST_CM_STATUS_EVENT_ENABLE_BITMASK:
5145       proto_tree_add_bitmask(mdd_tree, tvb, pos, hf_docsis_mdd_cm_status_event_enable_bitmask, ett_sub_tlv, cm_status_event, ENC_BIG_ENDIAN);
5146       break;
5147     case DOWNSTREAM_ACTIVE_CHANNEL_LIST_MAP_UCD_TRANSPORT_INDICATOR:
5148       proto_tree_add_item (mdd_tree, hf_docsis_mdd_downstream_active_channel_list_map_ucd_transport_indicator, tvb, pos, 1, ENC_BIG_ENDIAN);
5149       break;
5150     case DOWNSTREAM_ACTIVE_CHANNEL_LIST_OFDM_PLC_PARAMETERS:
5151       proto_tree_add_bitmask(mdd_tree, tvb, pos, hf_docsis_mdd_ofdm_plc_parameters, ett_sub_tlv, ofdm_plc_parameters, ENC_BIG_ENDIAN);
5152       break;
5153     case DOWNSTREAM_ACTIVE_CHANNEL_LIST_FDX_SUB_BAND_ID:
5154       proto_tree_add_item (mdd_tree, hf_docsis_mdd_full_duplex_sub_band_id, tvb, pos, 1, ENC_BIG_ENDIAN);
5155       break;
5156     }
5157 
5158     pos += length;
5159   }
5160 }
5161 
5162 static void
5163 dissect_mdd_ds_service_group(tvbuff_t * tvb, packet_info* pinfo _U_, proto_tree * tree, int start, guint16 len)
5164 {
5165   guint8 type;
5166   guint32 i, length;
5167   proto_tree *mdd_tree;
5168   proto_item *mdd_item;
5169   int pos;
5170 
5171   pos = start;
5172   while ( pos < ( start + len) )
5173   {
5174     type = tvb_get_guint8 (tvb, pos);
5175     mdd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
5176                                             ett_docsis_mdd_ds_service_group, &mdd_item,
5177                                             val_to_str(type, mdd_ds_service_group_vals,
5178                                                        "Unknown TLV (%u)"));
5179     proto_tree_add_uint (mdd_tree, hf_docsis_mdd_ds_service_group_subtype, tvb, pos, 1, type);
5180     pos++;
5181     proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_ds_service_group_length, tvb, pos, 1, ENC_NA, &length);
5182     pos++;
5183     proto_item_set_len(mdd_item, length + 2);
5184 
5185     switch(type)
5186     {
5187     case MAC_DOMAIN_DOWNSTREAM_SERVICE_GROUP_MD_DS_SG_IDENTIFIER:
5188       proto_tree_add_item (mdd_tree, hf_docsis_mdd_mac_domain_downstream_service_group_md_ds_sg_identifier, tvb, pos, 1, ENC_BIG_ENDIAN);
5189      break;
5190     case MAC_DOMAIN_DOWNSTREAM_SERVICE_GROUP_CHANNEL_IDS:
5191       for (i = 0; i < length; i++) {
5192         proto_tree_add_item (mdd_tree, hf_docsis_mdd_mac_domain_downstream_service_group_channel_id, tvb, pos + i , 1, ENC_BIG_ENDIAN);
5193       }
5194       break;
5195     }
5196 
5197     pos += length;
5198   }
5199 }
5200 
5201 static void
5202 dissect_mdd_channel_profile_reporting_control(tvbuff_t * tvb, packet_info* pinfo _U_, proto_tree * tree, int start, guint16 len)
5203 {
5204   guint8 type;
5205   guint32 length;
5206   proto_tree *mdd_tree;
5207   proto_item *mdd_item;
5208   int pos;
5209 
5210   pos = start;
5211   while ( pos < ( start + len) )
5212   {
5213     type = tvb_get_guint8 (tvb, pos);
5214     mdd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
5215                                             ett_docsis_mdd_channel_profile_reporting_control, &mdd_item,
5216                                             val_to_str(type, mdd_channel_profile_reporting_control_vals,
5217                                                        "Unknown TLV (%u)"));
5218     proto_tree_add_uint (mdd_tree, hf_docsis_mdd_channel_profile_reporting_control_subtype, tvb, pos, 1, type);
5219     pos++;
5220     proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_channel_profile_reporting_control_length, tvb, pos, 1, ENC_NA, &length);
5221     pos++;
5222     proto_item_set_len(mdd_item, length + 2);
5223 
5224     switch(type)
5225     {
5226     case RCP_CENTER_FREQUENCY_SPACING:
5227       proto_tree_add_item (mdd_tree, hf_docsis_mdd_rcp_center_frequency_spacing, tvb, pos, 1, ENC_BIG_ENDIAN);
5228       break;
5229     case VERBOSE_RCP_REPORTING:
5230       proto_tree_add_item (mdd_tree, hf_docsis_mdd_verbose_rcp_reporting, tvb, pos, 1, ENC_BIG_ENDIAN);
5231       break;
5232     case FRAGMENTED_RCP_TRANSMISSION:
5233       proto_tree_add_item (mdd_tree, hf_docsis_mdd_fragmented_rcp_transmission, tvb, pos, 1, ENC_BIG_ENDIAN);
5234       break;
5235     }
5236 
5237     pos += length;
5238   }
5239 }
5240 
5241 static void
5242 dissect_mdd_ip_init_param(tvbuff_t * tvb, packet_info* pinfo _U_, proto_tree * tree, int start, guint16 len)
5243 {
5244   guint8 type;
5245   guint32 length;
5246   proto_tree *mdd_tree;
5247   proto_item *mdd_item;
5248   int pos;
5249 
5250   pos = start;
5251   while ( pos < ( start + len) )
5252   {
5253     type = tvb_get_guint8 (tvb, pos);
5254     mdd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
5255                                             ett_docsis_mdd_ip_init_param, &mdd_item,
5256                                             val_to_str(type, mdd_ip_init_param_vals,
5257                                                        "Unknown TLV (%u)"));
5258     proto_tree_add_uint (mdd_tree, hf_docsis_mdd_ip_init_param_subtype, tvb, pos, 1, type);
5259     pos++;
5260     proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_ip_init_param_length, tvb, pos, 1, ENC_NA, &length);
5261     pos++;
5262     proto_item_set_len(mdd_item, length + 2);
5263 
5264     switch(type)
5265     {
5266     case IP_PROVISIONING_MODE:
5267       proto_tree_add_item (mdd_tree, hf_docsis_mdd_ip_provisioning_mode, tvb, pos, 1, ENC_BIG_ENDIAN);
5268       break;
5269     case PRE_REGISTRATION_DSID:
5270       proto_tree_add_item (mdd_tree, hf_docsis_mdd_pre_registration_dsid, tvb, pos, 3, ENC_BIG_ENDIAN);
5271       break;
5272     }
5273 
5274     pos += length;
5275   }
5276 }
5277 
5278 static void
5279 dissect_mdd_upstream_active_channel_list_dschids_maps_ucds(tvbuff_t * tvb, proto_tree * tree, guint start, guint16 len)
5280 {
5281   guint16 i;
5282   proto_item *it;
5283   proto_tree *dschid_tree;
5284 
5285   it = proto_tree_add_item (tree, hf_docsis_mdd_upstream_active_channel_list_dschids_maps_ucds, tvb, start, len, ENC_NA);
5286   dschid_tree = proto_item_add_subtree (it, ett_docsis_mdd_upstream_active_channel_list_dschids_maps_ucds_dschids);
5287 
5288   for(i = 0; i< len; ++i)
5289   {
5290     proto_tree_add_item (dschid_tree, hf_docsis_mdd_upstream_active_channel_list_dschids_maps_ucds_dschid, tvb, start + i, 1, ENC_BIG_ENDIAN);
5291   }
5292 }
5293 
5294 static void
5295 dissect_mdd_upstream_active_channel_list(tvbuff_t * tvb, packet_info* pinfo _U_, proto_tree * tree, int start, guint16 len)
5296 {
5297   guint8 type;
5298   guint32 length;
5299   proto_tree *mdd_tree;
5300   proto_item *mdd_item;
5301   int pos;
5302   static int * const cm_status_event[] = {
5303     &hf_docsis_mdd_cm_status_event_enable_bitmask_t4_timeout,
5304     &hf_docsis_mdd_cm_status_event_enable_bitmask_t3_retries_exceeded,
5305     &hf_docsis_mdd_cm_status_event_enable_bitmask_successful_ranging_after_t3_retries_exceeded,
5306     NULL
5307   };
5308 
5309   pos = start;
5310   while ( pos < ( start + len) )
5311   {
5312     type = tvb_get_guint8 (tvb, pos);
5313     mdd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
5314                                             ett_docsis_mdd_up_active_channel_list, &mdd_item,
5315                                             val_to_str(type, mdd_up_active_channel_list_vals,
5316                                                        "Unknown TLV (%u)"));
5317     proto_tree_add_uint (mdd_tree, hf_docsis_mdd_up_active_channel_list_subtype, tvb, pos, 1, type);
5318     pos++;
5319     proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_up_active_channel_list_length, tvb, pos, 1, ENC_NA, &length);
5320     pos++;
5321     proto_item_set_len(mdd_item, length + 2);
5322 
5323     switch(type)
5324     {
5325     case UPSTREAM_ACTIVE_CHANNEL_LIST_UPSTREAM_CHANNEL_ID:
5326       proto_tree_add_item (mdd_tree, hf_docsis_mdd_upstream_active_channel_list_upstream_channel_id, tvb, pos, 1, ENC_BIG_ENDIAN);
5327       break;
5328     case UPSTREAM_ACTIVE_CHANNEL_LIST_CM_STATUS_EVENT_ENABLE_BITMASK:
5329       proto_tree_add_bitmask(mdd_tree, tvb, pos, hf_docsis_mdd_cm_status_event_enable_bitmask, ett_sub_tlv, cm_status_event, ENC_BIG_ENDIAN);
5330       break;
5331     case UPSTREAM_ACTIVE_CHANNEL_LIST_UPSTREAM_CHANNEL_PRIORITY:
5332       proto_tree_add_item (mdd_tree, hf_docsis_mdd_upstream_active_channel_list_upstream_channel_priority, tvb, pos, 1, ENC_BIG_ENDIAN);
5333       break;
5334     case UPSTREAM_ACTIVE_CHANNEL_LIST_DSCHIDS_MAPS_UCDS:
5335       dissect_mdd_upstream_active_channel_list_dschids_maps_ucds(tvb, mdd_tree, pos, length);
5336       break;
5337     case UPSTREAM_ACTIVE_CHANNEL_LIST_FDX_UPSTREAM_CHANNEL:
5338       proto_tree_add_item (mdd_tree, hf_docsis_mdd_upstream_active_channel_list_fdx_upstream_channel, tvb, pos, 1, ENC_BIG_ENDIAN);
5339       break;
5340     case UPSTREAM_ACTIVE_CHANNEL_LIST_FDX_SUBBAND_ID:
5341       proto_tree_add_item (mdd_tree, hf_docsis_mdd_upstream_active_channel_list_fdx_subband_id, tvb, pos, 1, ENC_BIG_ENDIAN);
5342       break;
5343     }
5344 
5345     pos += length;
5346   }
5347 }
5348 
5349 static void
5350 dissect_mdd_cm_status_event_control(tvbuff_t * tvb, packet_info* pinfo _U_, proto_tree * tree, int start, guint16 len)
5351 {
5352   guint8 type;
5353   guint32 length, timer;
5354   proto_tree *mdd_tree;
5355   proto_item *mdd_item, *text_item;
5356   int pos;
5357 
5358   pos = start;
5359   while ( pos < ( start + len) )
5360   {
5361     type = tvb_get_guint8 (tvb, pos);
5362     mdd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
5363                                             ett_docsis_mdd_cm_status_event_control, &mdd_item,
5364                                             val_to_str(type, mdd_cm_status_event_control_vals,
5365                                                        "Unknown TLV (%u)"));
5366     proto_tree_add_uint (mdd_tree, hf_docsis_mdd_cm_status_event_control_subtype, tvb, pos, 1, type);
5367     pos++;
5368     proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_cm_status_event_control_length, tvb, pos, 1, ENC_NA, &length);
5369     pos++;
5370     proto_item_set_len(mdd_item, length + 2);
5371 
5372     switch(type)
5373     {
5374     case EVENT_TYPE_CODE:
5375       proto_tree_add_item (mdd_tree, hf_docsis_mdd_event_type, tvb, pos, 1, ENC_BIG_ENDIAN);
5376       break;
5377     case MAXIMUM_EVENT_HOLDOFF_TIMER:
5378       text_item = proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_maximum_event_holdoff_timer, tvb, pos, 2, ENC_BIG_ENDIAN, &timer);
5379       proto_item_append_text(text_item, " (%d ms)", timer * 20);
5380       break;
5381     case MAXIMUM_NUMBER_OF_REPORTS_PER_EVENT:
5382       proto_tree_add_item (mdd_tree, hf_docsis_mdd_maximum_number_of_reports_per_event, tvb, pos, 1, ENC_BIG_ENDIAN);
5383       break;
5384     }
5385 
5386     pos += length;
5387   }
5388 }
5389 
5390 static void
5391 dissect_mdd_dsg_da_to_dsid(tvbuff_t * tvb, packet_info* pinfo _U_, proto_tree * tree, int start, guint16 len)
5392 {
5393   guint8 type;
5394   guint32 length;
5395   proto_tree *mdd_tree;
5396   proto_item *mdd_item;
5397   int pos;
5398 
5399   pos = start;
5400   while ( pos < ( start + len) )
5401   {
5402     type = tvb_get_guint8 (tvb, pos);
5403     mdd_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
5404                                             ett_docsis_mdd_dsg_da_to_dsid, &mdd_item,
5405                                             val_to_str(type, mdd_cm_dsg_da_to_dsid_vals,
5406                                                        "Unknown TLV (%u)"));
5407     proto_tree_add_uint (mdd_tree, hf_docsis_mdd_dsg_da_to_dsid_subtype, tvb, pos, 1, type);
5408     pos++;
5409     proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_dsg_da_to_dsid_length, tvb, pos, 1, ENC_NA, &length);
5410     pos++;
5411     proto_item_set_len(mdd_item, length + 2);
5412 
5413     switch(type)
5414     {
5415     case DSG_DA_TO_DSID_ASSOCIATION_DA:
5416       proto_tree_add_item (mdd_tree, hf_docsis_mdd_dsg_da_to_dsid_association_da, tvb, pos, 6, ENC_NA);
5417       break;
5418     case DSG_DA_TO_DSID_ASSOCIATION_DSID:
5419       proto_tree_add_item (mdd_tree, hf_docsis_mdd_dsg_da_to_dsid_association_dsid, tvb, pos, 3, ENC_BIG_ENDIAN);
5420       break;
5421     }
5422 
5423     pos += length;
5424   }
5425 }
5426 
5427 static void
5428 dissect_mdd_diplexer_band_edge(tvbuff_t * tvb, packet_info* pinfo _U_, proto_tree * tree, int start, guint16 len)
5429 {
5430   guint8 type;
5431   guint32 length;
5432   proto_tree *mdd_tree;
5433   proto_item *mdd_item;
5434   int pos;
5435 
5436   pos = start;
5437   while ( pos < ( start + len) )
5438   {
5439     type = tvb_get_guint8 (tvb, pos);
5440     mdd_tree = proto_tree_add_subtree(tree, tvb, pos, 1,
5441                                             ett_docsis_mdd_diplexer_band_edge, &mdd_item,
5442                                             val_to_str(type, mdd_diplexer_band_edge_vals,
5443                                                        "Unknown TLV (%u)"));
5444     proto_tree_add_uint (mdd_tree, hf_docsis_mdd_diplexer_band_edge, tvb, pos, 1, type);
5445     pos++;
5446     proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_diplexer_band_edge_length, tvb, pos, 1, ENC_BIG_ENDIAN, &length);
5447     pos++;
5448     proto_item_set_len(mdd_item, length + 2);
5449 
5450     if (length == 1)
5451     {
5452       switch(type)
5453       {
5454       case DIPLEXER_US_UPPER_BAND_EDGE:
5455         proto_tree_add_item (mdd_tree, hf_docsis_mdd_diplexer_us_upper_band_edge, tvb, pos, length, ENC_BIG_ENDIAN);
5456         break;
5457       case DIPLEXER_DS_LOWER_BAND_EDGE:
5458         proto_tree_add_item (mdd_tree, hf_docsis_mdd_diplexer_ds_lower_band_edge, tvb, pos, length, ENC_BIG_ENDIAN);
5459         break;
5460       case DIPLEXER_DS_UPPER_BAND_EDGE:
5461         proto_tree_add_item (mdd_tree, hf_docsis_mdd_diplexer_ds_upper_band_edge, tvb, pos, length, ENC_BIG_ENDIAN);
5462         break;
5463       default:
5464         expert_add_info_format(pinfo, mdd_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown Diplexer Band Edge TLV type: %u", type);
5465         break;
5466       }
5467     } else
5468     {
5469       expert_add_info_format(pinfo, mdd_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5470       break;
5471     }
5472     pos += length;
5473   }
5474 }
5475 
5476 static void
5477 dissect_mdd_full_duplex_descriptor(tvbuff_t * tvb, packet_info* pinfo _U_, proto_tree * tree, int start, guint16 len)
5478 {
5479   guint8 type;
5480   guint8 subtype;
5481   guint32 length;
5482   guint32 sublength;
5483   proto_tree *mdd_tree;
5484   proto_tree *fdx_sub_band_tree;
5485   proto_item *mdd_item;
5486   proto_item *fdx_sub_band_item;
5487   proto_item *fdx_sub_band_offset_item;
5488   int pos;
5489   guint subpos;
5490   guint32 sub_band_offset;
5491 
5492   pos = start;
5493   while ( pos < ( start + len) )
5494   {
5495     type = tvb_get_guint8 (tvb, pos);
5496     mdd_tree = proto_tree_add_subtree(tree, tvb, pos, 1,
5497                                             ett_docsis_mdd_full_duplex_descriptor, &mdd_item,
5498                                             val_to_str(type, mdd_full_duplex_descriptor_vals,
5499                                                        "Unknown TLV (%u)"));
5500     proto_tree_add_uint (mdd_tree, hf_docsis_mdd_full_duplex_descriptor, tvb, pos, 1, type);
5501     pos++;
5502     proto_tree_add_item_ret_uint (mdd_tree, hf_docsis_mdd_full_duplex_descriptor_length, tvb, pos, 1, ENC_BIG_ENDIAN, &length);
5503     pos++;
5504     proto_item_set_len(mdd_item, length + 2);
5505 
5506     switch(type)
5507     {
5508     case FDX_ALLOCATED_SPECTRUM:
5509       if (length == 1)
5510       {
5511         proto_tree_add_item (mdd_tree, hf_docsis_mdd_full_duplex_allocated_spectrum, tvb, pos, length, ENC_BIG_ENDIAN);
5512       } else
5513       {
5514         expert_add_info_format(pinfo, mdd_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5515       }
5516       break;
5517     case FDX_TOTAL_NUMBER_OF_SUB_BANDS:
5518       if (length == 1)
5519       {
5520         proto_tree_add_item (mdd_tree, hf_docsis_mdd_full_duplex_total_number_of_sub_bands, tvb, pos, length, ENC_BIG_ENDIAN);
5521       } else
5522       {
5523         expert_add_info_format(pinfo, mdd_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5524       }
5525       break;
5526     case FDX_SUB_BAND_WIDTH:
5527       if (length == 1)
5528       {
5529         proto_tree_add_item (mdd_tree, hf_docsis_mdd_full_duplex_sub_band_width, tvb, pos, length, ENC_BIG_ENDIAN);
5530       } else
5531       {
5532         expert_add_info_format(pinfo, mdd_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5533       }
5534       break;
5535     case FDX_SUB_BAND_DESCRIPTOR:
5536       subpos = pos;
5537       while (subpos < pos + length) {
5538         subtype = tvb_get_guint8 (tvb, subpos);
5539         fdx_sub_band_tree = proto_tree_add_subtree(mdd_tree, tvb, subpos, -1,
5540                                                    ett_docsis_mdd_full_duplex_sub_band_descriptor, &fdx_sub_band_item,
5541                                                    val_to_str(subtype, mdd_full_duplex_sub_band_vals,
5542                                                    "Unknown TLV (%u)"));
5543         proto_tree_add_item (fdx_sub_band_tree, hf_docsis_mdd_full_duplex_sub_band_descriptor, tvb, subpos, 1, ENC_BIG_ENDIAN);
5544         proto_tree_add_item_ret_uint (fdx_sub_band_tree, hf_docsis_mdd_full_duplex_sub_band_descriptor_length, tvb, subpos + 1, 1, ENC_BIG_ENDIAN, &sublength);
5545         proto_item_set_len(fdx_sub_band_item, sublength + 2);
5546         switch(subtype) {
5547           case FDX_SUB_BAND_ID:
5548             if (sublength == 1)
5549             {
5550               proto_tree_add_item (fdx_sub_band_tree, hf_docsis_mdd_full_duplex_sub_band_id, tvb, subpos + 2, sublength, ENC_BIG_ENDIAN);
5551             } else
5552             {
5553               expert_add_info_format(pinfo, fdx_sub_band_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", sublength);
5554             }
5555             break;
5556          case FDX_SUB_BAND_OFFSET:
5557             if (sublength == 2)
5558             {
5559               fdx_sub_band_offset_item = proto_tree_add_item_ret_uint (fdx_sub_band_tree, hf_docsis_mdd_full_duplex_sub_band_offset,
5560                                                                        tvb, subpos + 2, sublength, ENC_BIG_ENDIAN, &sub_band_offset);
5561               proto_item_append_text(fdx_sub_band_offset_item, "%s", (sub_band_offset) ? " MHz" : " (108 MHz)");
5562             } else
5563             {
5564               expert_add_info_format(pinfo, fdx_sub_band_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", sublength);
5565             }
5566             break;
5567           default:
5568             expert_add_info_format(pinfo, mdd_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown Full Duplex Sub-band TLV type: %u", subtype);
5569             break;
5570         }
5571         subpos += sublength + 2;
5572       }
5573       break;
5574     default:
5575       expert_add_info_format(pinfo, mdd_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown Full Duplex Descriptor TLV type: %u", type);
5576       break;
5577     }
5578     pos += length;
5579   }
5580 }
5581 
5582 static int
5583 dissect_mdd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5584 {
5585   proto_item *it;
5586   proto_tree *mdd_tree;
5587 
5588   int pos;
5589   guint subpos = 0;
5590   guint8 type;
5591   guint32 i, length;
5592   guint8 subtype;
5593   guint32 sublength;
5594 
5595   proto_tree *tlv_tree;
5596   proto_item *tlv_item;
5597   static int * const non_channel_events[] = {
5598       &hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_sequence_out_of_range,
5599       &hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_operating_on_battery_backup,
5600       &hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_returned_to_ac_power,
5601       NULL
5602   };
5603 
5604   col_set_str(pinfo->cinfo, COL_INFO, "MDD Message:");
5605 
5606   it = proto_tree_add_item (tree, proto_docsis_mdd, tvb, 0, -1,ENC_NA);
5607   mdd_tree = proto_item_add_subtree (it, ett_docsis_mdd);
5608 
5609   proto_tree_add_item (mdd_tree, hf_docsis_mdd_ccc, tvb, 0, 1, ENC_BIG_ENDIAN);
5610   proto_tree_add_item (mdd_tree, hf_docsis_mdd_number_of_fragments, tvb, 1, 1, ENC_BIG_ENDIAN);
5611   proto_tree_add_item (mdd_tree, hf_docsis_mdd_fragment_sequence_number, tvb, 2, 1, ENC_BIG_ENDIAN);
5612   proto_tree_add_item (mdd_tree, hf_docsis_mdd_current_channel_dcid, tvb, 3, 1, ENC_BIG_ENDIAN);
5613 
5614   /* TLVs... */
5615   pos = 4;
5616   while (tvb_reported_length_remaining(tvb, pos) > 0)
5617   {
5618     type = tvb_get_guint8 (tvb, pos);
5619     tlv_tree = proto_tree_add_subtree(mdd_tree, tvb, pos, -1,
5620                                             ett_tlv, &tlv_item,
5621                                             val_to_str(type, mdd_tlv_vals,
5622                                                        "Unknown TLV (%u)"));
5623     proto_tree_add_uint (tlv_tree, hf_docsis_mdd_type, tvb, pos, 1, type);
5624     pos++;
5625     proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_mdd_length, tvb, pos, 1, ENC_NA, &length);
5626     pos++;
5627     proto_item_set_len(tlv_item, length + 2);
5628 
5629     switch(type)
5630     {
5631     case DOWNSTREAM_ACTIVE_CHANNEL_LIST:
5632       dissect_mdd_ds_active_channel_list(tvb, pinfo, tlv_tree, pos, length );
5633       break;
5634     case MAC_DOMAIN_DOWNSTREAM_SERVICE_GROUP:
5635       dissect_mdd_ds_service_group(tvb, pinfo, tlv_tree, pos, length );
5636       break;
5637     case DOWNSTREAM_AMBIGUITY_RESOLUTION_FREQUENCY_LIST:
5638       for (i = 0; i < length; i+=4) {
5639         proto_tree_add_item (tlv_tree, hf_docsis_mdd_downstream_ambiguity_resolution_frequency, tvb, pos + i, 4, ENC_BIG_ENDIAN);
5640       }
5641       break;
5642     case RECEIVE_CHANNEL_PROFILE_REPORTING_CONTROL:
5643       dissect_mdd_channel_profile_reporting_control(tvb, pinfo, tlv_tree, pos, length );
5644       break;
5645     case IP_INITIALIZATION_PARAMETERS:
5646       dissect_mdd_ip_init_param(tvb, pinfo, tlv_tree, pos, length );
5647       break;
5648     case EARLY_AUTHENTICATION_AND_ENCRYPTION:
5649       proto_tree_add_item (tlv_tree, hf_docsis_mdd_early_authentication_and_encryption, tvb, pos, 1, ENC_BIG_ENDIAN);
5650       break;
5651     case UPSTREAM_ACTIVE_CHANNEL_LIST:
5652       dissect_mdd_upstream_active_channel_list(tvb, pinfo, tlv_tree, pos, length );
5653       break;
5654     case UPSTREAM_AMBIGUITY_RESOLUTION_CHANNEL_LIST:
5655       for (i = 0; i < length; i++) {
5656         proto_tree_add_item (tlv_tree, hf_docsis_mdd_upstream_ambiguity_resolution_channel_list_channel_id, tvb, pos + i , 1, ENC_BIG_ENDIAN);
5657       }
5658       break;
5659     case UPSTREAM_FREQUENCY_RANGE:
5660       proto_tree_add_item (tlv_tree, hf_docsis_mdd_upstream_frequency_range, tvb, pos, 1, ENC_BIG_ENDIAN);
5661       break;
5662     case SYMBOL_CLOCK_LOCKING_INDICATOR:
5663       proto_tree_add_item (tlv_tree, hf_docsis_mdd_symbol_clock_locking_indicator, tvb, pos, 1, ENC_BIG_ENDIAN);
5664       break;
5665     case CM_STATUS_EVENT_CONTROL:
5666       dissect_mdd_cm_status_event_control(tvb, pinfo, tlv_tree, pos, length );
5667       break;
5668     case UPSTREAM_TRANSMIT_POWER_REPORTING:
5669       proto_tree_add_item (tlv_tree, hf_docsis_mdd_upstream_transmit_power_reporting, tvb, pos, 1, ENC_BIG_ENDIAN);
5670       break;
5671     case DSG_DA_TO_DSID_ASSOCIATION_ENTRY:
5672       dissect_mdd_dsg_da_to_dsid(tvb, pinfo, tlv_tree, pos, length );
5673       break;
5674     case CM_STATUS_EVENT_ENABLE_NON_CHANNEL_SPECIFIC_EVENTS:
5675       proto_tree_add_bitmask(tlv_tree, tvb, pos, hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events, ett_sub_tlv, non_channel_events, ENC_BIG_ENDIAN);
5676       break;
5677     case EXTENDED_UPSTREAM_TRANSMIT_POWER_SUPPORT:
5678       proto_tree_add_item (tlv_tree, hf_docsis_mdd_extended_upstream_transmit_power_support, tvb, pos, 1, ENC_BIG_ENDIAN);
5679       break;
5680     case CMTS_DOCSIS_VERSION:
5681       subpos = pos;
5682       while (subpos < pos + length + 2) {
5683         subtype = tvb_get_guint8 (tvb, subpos);
5684         sublength = tvb_get_guint8 (tvb, subpos + 1);
5685         switch(subtype) {
5686           case CMTS_MAJOR_DOCSIS_VERSION:
5687             proto_tree_add_item (tlv_tree, hf_docsis_mdd_cmts_major_docsis_version, tvb, subpos + 2, sublength, ENC_NA);
5688             break;
5689           case CMTS_MINOR_DOCSIS_VERSION:
5690             proto_tree_add_item (tlv_tree, hf_docsis_mdd_cmts_minor_docsis_version, tvb, subpos + 2, sublength, ENC_BIG_ENDIAN);
5691             break;
5692         }
5693         subpos += sublength + 2;
5694       }
5695       break;
5696     case CM_PERIODIC_MAINTENANCE_TIMEOUT_INDICATOR:
5697       proto_tree_add_item (tlv_tree, hf_docsis_mdd_cm_periodic_maintenance_timeout_indicator, tvb, pos, length, ENC_BIG_ENDIAN);
5698       break;
5699     case DLS_BROADCAST_AND_MULTICAST_DELIVERY_METHOD:
5700       proto_tree_add_item (tlv_tree, hf_docsis_mdd_dls_broadcast_and_multicast_delivery_method, tvb, pos, length, ENC_BIG_ENDIAN);
5701       break;
5702     case CM_STATUS_EVENT_ENABLE_FOR_DOCSIS_3_1_EVENTS:
5703       if (length == 4) {
5704         static int * const mdd_cm_status_event_d31[] = {
5705           &hf_docsis_mdd_cm_status_event_d31_ofdm_prof_fail,
5706           &hf_docsis_mdd_cm_status_event_d31_prim_down_chan_change,
5707           &hf_docsis_mdd_cm_status_event_d31_dpd_mismatch,
5708           &hf_docsis_mdd_cm_status_event_d31_deprecated,
5709           &hf_docsis_mdd_cm_status_event_d31_ncp_prof_fail,
5710           &hf_docsis_mdd_cm_status_event_d31_loss_fec_plc,
5711           &hf_docsis_mdd_cm_status_event_d31_ncp_prof_recover,
5712           &hf_docsis_mdd_cm_status_event_d31_fec_recover_on_plc,
5713           &hf_docsis_mdd_cm_status_event_d31_fec_recover_on_ofdm_prof,
5714           &hf_docsis_mdd_cm_status_event_d31_ofdma_prof_fail,
5715           &hf_docsis_mdd_cm_status_event_d31_map_stor_overflow_ind,
5716           &hf_docsis_mdd_cm_status_event_d31_ofdm_map_stor_almost_full_ind,
5717           &hf_docsis_mdd_cm_status_event_d31_reserved,
5718           NULL
5719         };
5720         proto_tree_add_bitmask_list(tlv_tree, tvb, pos, length, mdd_cm_status_event_d31, ENC_BIG_ENDIAN);
5721       }
5722       else
5723       {
5724         expert_add_info_format(pinfo, tlv_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5725       }
5726       break;
5727     case DIPLEXER_BAND_EDGE:
5728       dissect_mdd_diplexer_band_edge(tvb, pinfo, tlv_tree, pos, length );
5729       break;
5730     case FULL_DUPLEX_DESCRIPTOR:
5731       dissect_mdd_full_duplex_descriptor(tvb, pinfo, tlv_tree, pos, length );
5732       break;
5733     }
5734 
5735     pos += length;
5736   }
5737 
5738   return tvb_captured_length(tvb);
5739 }
5740 
5741 static int
5742 dissect_bintrngreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5743 {
5744   proto_item *bintrngreq_item;
5745   proto_tree *bintrngreq_tree;
5746   guint8 md_ds_sg_id;
5747   guint16 offset = 0;
5748 
5749   md_ds_sg_id = tvb_get_guint8 (tvb, 1);
5750 
5751   col_add_fstr (pinfo->cinfo, COL_INFO, "Bonded Initial Ranging Request: MD-DS-SG-ID = %u (0x%X)",
5752                 md_ds_sg_id, md_ds_sg_id );
5753 
5754   bintrngreq_item = proto_tree_add_item(tree, proto_docsis_bintrngreq, tvb, offset, -1, ENC_NA);
5755   bintrngreq_tree = proto_item_add_subtree (bintrngreq_item, ett_docsis_bintrngreq);
5756   proto_tree_add_item (bintrngreq_tree, hf_docsis_bintrngreq_capflags, tvb, offset, 1, ENC_BIG_ENDIAN);
5757   proto_tree_add_item( bintrngreq_tree, hf_docsis_bintrngreq_capflags_frag, tvb, offset, 1, ENC_BIG_ENDIAN );
5758   proto_tree_add_item( bintrngreq_tree, hf_docsis_bintrngreq_capflags_encrypt, tvb, offset, 1, ENC_BIG_ENDIAN );
5759   offset++;
5760   proto_tree_add_item (bintrngreq_tree, hf_docsis_bintrngreq_mddsgid, tvb, offset, 1, ENC_BIG_ENDIAN);
5761   offset++;
5762   proto_tree_add_item (bintrngreq_tree, hf_docsis_mgt_down_chid, tvb, offset, 1, ENC_BIG_ENDIAN);
5763   offset++;
5764   proto_tree_add_item (bintrngreq_tree, hf_docsis_mgt_upstream_chid, tvb, offset, 1, ENC_BIG_ENDIAN);
5765 
5766   return tvb_captured_length(tvb);
5767 }
5768 
5769 static int
5770 dissect_type35ucd(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5771 {
5772   return dissect_any_ucd(tvb, pinfo, tree, proto_docsis_type35ucd, MGT_TYPE35UCD);
5773 }
5774 
5775 static int
5776 dissect_dbcreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5777 {
5778   proto_item *dbcreq_item, *reassembled_item;
5779   proto_tree *dbcreq_tree, *reassembled_tree;
5780   guint32 transid, number_of_fragments, fragment_sequence_number;
5781   tvbuff_t *next_tvb;
5782 
5783   dbcreq_item = proto_tree_add_item(tree, proto_docsis_dbcreq, tvb, 0, -1, ENC_NA);
5784   dbcreq_tree = proto_item_add_subtree (dbcreq_item, ett_docsis_dbcreq);
5785   proto_tree_add_item_ret_uint(dbcreq_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
5786   proto_tree_add_item_ret_uint( dbcreq_tree, hf_docsis_dbcreq_number_of_fragments, tvb, 2, 1, ENC_BIG_ENDIAN, &number_of_fragments);
5787   proto_tree_add_item_ret_uint( dbcreq_tree, hf_docsis_dbcreq_fragment_sequence_number, tvb, 3, 1, ENC_BIG_ENDIAN, &fragment_sequence_number);
5788 
5789   col_add_fstr (pinfo->cinfo, COL_INFO,
5790                 "Dynamic Bonding Change Request: Transaction ID = %u", transid);
5791   col_set_fence(pinfo->cinfo, COL_INFO);
5792 
5793   if(number_of_fragments > 1) {
5794      pinfo->fragmented = TRUE;
5795 
5796      fragment_head* reassembled_tlv = NULL;
5797      reassembled_tlv = fragment_add_seq_check(&docsis_tlv_reassembly_table,
5798                                   tvb, 4, pinfo,
5799                                   transid, NULL, /* ID for fragments belonging together */
5800                                   fragment_sequence_number -1, /* Sequence number starts at 0 */
5801                                   tvb_reported_length_remaining(tvb, 4), /* fragment length - to the end */
5802                                   (fragment_sequence_number != number_of_fragments)); /* More fragments? */
5803 
5804      if (reassembled_tlv) {
5805        tvbuff_t *tlv_tvb = NULL;
5806 
5807        reassembled_item = proto_tree_add_item(dbcreq_tree, hf_docsis_tlv_reassembled, tvb, 0, -1, ENC_NA);
5808        reassembled_tree = proto_item_add_subtree (reassembled_item, ett_docsis_tlv_reassembled );
5809 
5810 
5811        tlv_tvb = process_reassembled_data(tvb, 4, pinfo, "Reassembled TLV", reassembled_tlv, &docsis_tlv_frag_items,
5812                                                   NULL, reassembled_tree);
5813 
5814        if (tlv_tvb && tvb_reported_length(tlv_tvb) > 0) {
5815          call_dissector (docsis_tlv_handle, tlv_tvb, pinfo, reassembled_tree);
5816        }
5817      }
5818 
5819   } else {
5820     /* Call Dissector for Appendix C TLVs */
5821     next_tvb = tvb_new_subset_remaining (tvb, 4);
5822     call_dissector (docsis_tlv_handle, next_tvb, pinfo, dbcreq_tree);
5823   }
5824 
5825   return tvb_captured_length(tvb);
5826 }
5827 
5828 static int
5829 dissect_dbcrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5830 {
5831   proto_item *dbcrsp_item;
5832   proto_tree *dbcrsp_tree;
5833   guint32 transid, confcode;
5834   tvbuff_t *next_tvb;
5835 
5836   dbcrsp_item = proto_tree_add_item(tree, proto_docsis_dbcrsp, tvb, 0, -1, ENC_NA);
5837   dbcrsp_tree = proto_item_add_subtree (dbcrsp_item, ett_docsis_dbcrsp);
5838   proto_tree_add_item_ret_uint(dbcrsp_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
5839   proto_tree_add_item_ret_uint( dbcrsp_tree, hf_docsis_dbcrsp_conf_code, tvb, 2, 1, ENC_BIG_ENDIAN, &confcode);
5840 
5841   col_add_fstr (pinfo->cinfo, COL_INFO,
5842                 "Dynamic Bonding Change Response: Transaction ID = %u (%s)", transid,
5843                 val_to_str_ext (confcode, &docsis_conf_code_ext, "%d"));
5844 
5845   /* Call Dissector for Appendix C TLVs */
5846   next_tvb = tvb_new_subset_remaining (tvb, 3);
5847   call_dissector (docsis_tlv_handle, next_tvb, pinfo, dbcrsp_tree);
5848   return tvb_captured_length(tvb);
5849 }
5850 
5851 static int
5852 dissect_dbcack (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5853 {
5854   proto_item *dbcack_item;
5855   proto_tree *dbcack_tree = NULL;
5856   guint16 transid;
5857   tvbuff_t *next_tvb;
5858 
5859   transid = tvb_get_ntohs (tvb, 0);
5860 
5861   col_add_fstr (pinfo->cinfo, COL_INFO,
5862                 "Dynamic Bonding Change Acknowledge: Transaction ID = %u", transid);
5863 
5864   dbcack_item = proto_tree_add_item(tree, proto_docsis_dbcack, tvb, 0, -1, ENC_NA);
5865   dbcack_tree = proto_item_add_subtree (dbcack_item, ett_docsis_dbcack);
5866   proto_tree_add_item (dbcack_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN);
5867 
5868   /* Call Dissector for Appendix C TLVs */
5869   next_tvb = tvb_new_subset_remaining (tvb, 2);
5870   call_dissector (docsis_tlv_handle, next_tvb, pinfo, dbcack_tree);
5871   return tvb_captured_length(tvb);
5872 }
5873 
5874 static int
5875 dissect_dpvreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5876 {
5877   proto_item *it;
5878   proto_tree *dpvreq_tree;
5879   guint32 transid, dschan;
5880 
5881   it = proto_tree_add_item(tree, proto_docsis_dpvreq, tvb, 0, -1, ENC_NA);
5882   dpvreq_tree = proto_item_add_subtree (it, ett_docsis_dpvreq);
5883   proto_tree_add_item_ret_uint (dpvreq_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
5884   proto_tree_add_item_ret_uint (dpvreq_tree, hf_docsis_mgt_down_chid, tvb, 2, 1, ENC_BIG_ENDIAN, &dschan);
5885 
5886   col_add_fstr (pinfo->cinfo, COL_INFO,
5887                 "DOCSIS Path Verify Request: Transaction ID = %u DS-Ch %d",
5888                 transid, dschan);
5889 
5890   proto_tree_add_item (dpvreq_tree, hf_docsis_dpv_flags, tvb, 3, 1, ENC_BIG_ENDIAN);
5891   proto_tree_add_item (dpvreq_tree, hf_docsis_dpv_us_sf, tvb, 4, 4, ENC_BIG_ENDIAN);
5892   proto_tree_add_item (dpvreq_tree, hf_docsis_dpv_n, tvb, 8, 2, ENC_BIG_ENDIAN);
5893   proto_tree_add_item (dpvreq_tree, hf_docsis_dpv_start, tvb, 10, 1, ENC_BIG_ENDIAN);
5894   proto_tree_add_item (dpvreq_tree, hf_docsis_dpv_end, tvb, 11, 1, ENC_BIG_ENDIAN);
5895   proto_tree_add_item (dpvreq_tree, hf_docsis_dpv_ts_start, tvb, 12, 4, ENC_BIG_ENDIAN);
5896   proto_tree_add_item (dpvreq_tree, hf_docsis_dpv_ts_end, tvb, 16, 4, ENC_BIG_ENDIAN);
5897 
5898   return tvb_captured_length(tvb);
5899 }
5900 
5901 static int
5902 dissect_dpvrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
5903 {
5904   proto_item *it;
5905   proto_tree *dpvrsp_tree = NULL;
5906   guint32 transid, dschan;
5907 
5908   it = proto_tree_add_item (tree, proto_docsis_dpvrsp, tvb, 0, -1, ENC_NA);
5909   dpvrsp_tree = proto_item_add_subtree (it, ett_docsis_dpvrsp);
5910   proto_tree_add_item_ret_uint (dpvrsp_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
5911   proto_tree_add_item_ret_uint (dpvrsp_tree, hf_docsis_mgt_down_chid, tvb, 2, 1, ENC_BIG_ENDIAN, &dschan);
5912 
5913   col_add_fstr (pinfo->cinfo, COL_INFO,
5914                 "DOCSIS Path Verify Response: Transaction ID = %u DS-Ch %d",
5915                 transid, dschan);
5916 
5917   proto_tree_add_item (dpvrsp_tree, hf_docsis_dpv_flags, tvb, 3, 1, ENC_BIG_ENDIAN);
5918   proto_tree_add_item (dpvrsp_tree, hf_docsis_dpv_us_sf, tvb, 4, 4, ENC_BIG_ENDIAN);
5919   proto_tree_add_item (dpvrsp_tree, hf_docsis_dpv_n, tvb, 8, 2, ENC_BIG_ENDIAN);
5920   proto_tree_add_item (dpvrsp_tree, hf_docsis_dpv_start, tvb, 10, 1, ENC_BIG_ENDIAN);
5921   proto_tree_add_item (dpvrsp_tree, hf_docsis_dpv_end, tvb, 11, 1, ENC_BIG_ENDIAN);
5922   proto_tree_add_item (dpvrsp_tree, hf_docsis_dpv_ts_start, tvb, 12, 4, ENC_BIG_ENDIAN);
5923   proto_tree_add_item (dpvrsp_tree, hf_docsis_dpv_ts_end, tvb, 16, 4, ENC_BIG_ENDIAN);
5924 
5925   return tvb_captured_length(tvb);
5926 }
5927 
5928 static void
5929 dissect_cmstatus_status_event_tlv (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree)
5930 {
5931   proto_item *it, *tlv_item, *tlv_len_item;
5932   proto_tree *tlv_tree, *tlvtlv_tree;
5933   guint16 pos = 0;
5934   guint8 type;
5935   guint32 length;
5936 
5937   it = proto_tree_add_item(tree, hf_docsis_cmstatus_status_event_tlv_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
5938   tlv_tree = proto_item_add_subtree (it, ett_docsis_cmstatus_status_event_tlv);
5939 
5940   while (tvb_reported_length_remaining(tvb, pos) > 0)
5941   {
5942     type = tvb_get_guint8 (tvb, pos);
5943     tlvtlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, -1,
5944                                             ett_docsis_cmstatus_status_event_tlvtlv, &tlv_item,
5945                                             val_to_str(type, cmstatus_status_event_tlv_vals,
5946                                                        "Unknown Status Event TLV (%u)"));
5947     proto_tree_add_uint (tlvtlv_tree, hf_docsis_cmstatus_status_event_type, tvb, pos, 1, type);
5948     pos++;
5949     tlv_len_item = proto_tree_add_item_ret_uint (tlvtlv_tree, hf_docsis_cmstatus_status_event_length, tvb, pos, 1, ENC_NA, &length);
5950     pos++;
5951     proto_item_set_len(tlv_item, length + 2);
5952 
5953     switch (type)
5954     {
5955     case EVENT_DS_CH_ID:
5956       if (length == 1)
5957       {
5958         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmstatus_status_event_ds_ch_id, tvb, pos, 1, ENC_BIG_ENDIAN);
5959       }
5960       else
5961       {
5962         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5963       }
5964       break;
5965 
5966     case EVENT_US_CH_ID:
5967       if (length == 1)
5968       {
5969         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmstatus_status_event_us_ch_id, tvb, pos, 1, ENC_BIG_ENDIAN);
5970       }
5971       else
5972       {
5973         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5974       }
5975       break;
5976 
5977     case EVENT_DSID:
5978       if (length == 3)
5979       {
5980         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmstatus_status_event_dsid, tvb, pos, 3, ENC_BIG_ENDIAN);
5981       }
5982       else
5983       {
5984         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5985       }
5986       break;
5987 
5988     case EVENT_MAC_ADDRESS:
5989       if (length == 6)
5990       {
5991         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmstatus_status_event_mac_address, tvb, pos, 6, ENC_NA);
5992       }
5993       else
5994       {
5995         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
5996       }
5997       break;
5998 
5999     case EVENT_DS_OFDM_PROFILE_ID:
6000       if (length == 1)
6001       {
6002         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmstatus_status_event_ds_ofdm_profile_id, tvb, pos, 1, ENC_BIG_ENDIAN);
6003       }
6004       else
6005       {
6006         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6007       }
6008       break;
6009 
6010     case EVENT_US_OFDMA_PROFILE_ID:
6011       if (length == 1)
6012       {
6013         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmstatus_status_event_us_ofdma_profile_id, tvb, pos, 1, ENC_BIG_ENDIAN);
6014       }
6015       else
6016       {
6017         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6018       }
6019       break;
6020 
6021     case EVENT_DESCR:
6022       if (length >= 1 && length <= 80)
6023       {
6024         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmstatus_status_event_descr, tvb, pos, length, ENC_NA);
6025       }
6026       else
6027       {
6028         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6029       }
6030       break;
6031     } /* switch */
6032       pos += length;
6033   } /* while */
6034 }
6035 
6036 static void
6037 dissect_cmstatus_tlv (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree)
6038 {
6039   proto_item *it, *tlv_item;
6040   proto_tree *tlv_tree, *tlvtlv_tree;
6041   guint16 pos = 0;
6042   guint8 type;
6043   guint32 length;
6044   tvbuff_t* next_tvb;
6045 
6046   it = proto_tree_add_item(tree, hf_docsis_cmstatus_tlv_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
6047   tlv_tree = proto_item_add_subtree (it, ett_docsis_cmstatus_tlv);
6048 
6049   while (tvb_reported_length_remaining(tvb, pos) > 0)
6050   {
6051     type = tvb_get_guint8 (tvb, pos);
6052     tlvtlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, -1,
6053                                             ett_docsis_cmstatus_tlvtlv, &tlv_item,
6054                                             val_to_str(type, cmstatus_tlv_vals,
6055                                                        "Unknown TLV (%u)"));
6056     proto_tree_add_uint (tlvtlv_tree, hf_docsis_cmstatus_type, tvb, pos, 1, type);
6057     pos++;
6058     proto_tree_add_item_ret_uint (tlvtlv_tree, hf_docsis_cmstatus_length, tvb, pos, 1, ENC_NA, &length);
6059     pos++;
6060     proto_item_set_len(tlv_item, length + 2);
6061 
6062     switch (type)
6063     {
6064     case STATUS_EVENT:
6065       next_tvb = tvb_new_subset_length(tvb, pos, length);
6066       dissect_cmstatus_status_event_tlv (next_tvb, pinfo, tlvtlv_tree);
6067       break;
6068 
6069     } /* switch */
6070       pos += length;
6071   } /* while */
6072 }
6073 
6074 static void
6075 dissect_cmstatus_common (tvbuff_t * tvb, proto_tree * tree)
6076 {
6077   guint8 event_type;
6078 
6079   event_type = tvb_get_guint8 (tvb, 2);
6080   switch (event_type)
6081   {
6082   case SEC_CH_MDD_TIMEOUT:
6083     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_mdd_t, tvb, 2, 1, ENC_BIG_ENDIAN);
6084     break;
6085 
6086   case QAM_FEC_LOCK_FAILURE:
6087     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_qfl_f, tvb, 2, 1, ENC_BIG_ENDIAN);
6088     break;
6089 
6090   case SEQ_OUT_OF_RANGE:
6091     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_s_o, tvb, 2, 1, ENC_BIG_ENDIAN);
6092     break;
6093 
6094   case SEC_CH_MDD_RECOVERY:
6095     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_mdd_r, tvb, 2, 1, ENC_BIG_ENDIAN);
6096     break;
6097 
6098   case QAM_FEC_LOCK_RECOVERY:
6099     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_qfl_r, tvb, 2, 1, ENC_BIG_ENDIAN);
6100     break;
6101 
6102   case T4_TIMEOUT:
6103     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_t4_t, tvb, 2, 1, ENC_BIG_ENDIAN);
6104     break;
6105 
6106   case T3_RETRIES_EXCEEDED:
6107     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_t3_e, tvb, 2, 1, ENC_BIG_ENDIAN);
6108     break;
6109 
6110   case SUCCESS_RANGING_AFTER_T3_RETRIES_EXCEEDED:
6111     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_rng_s, tvb, 2, 1, ENC_BIG_ENDIAN);
6112     break;
6113 
6114   case CM_ON_BATTERY:
6115     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_cm_b, tvb, 2, 1, ENC_BIG_ENDIAN);
6116     break;
6117 
6118   case CM_ON_AC_POWER:
6119     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_cm_a, tvb, 2, 1, ENC_BIG_ENDIAN);
6120     break;
6121 
6122   case MAC_REMOVAL_EVENT:
6123     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_mac_removal, tvb, 2, 1, ENC_BIG_ENDIAN);
6124     break;
6125 
6126   case DS_OFDM_PROFILE_FAILURE:
6127     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_ds_ofdm_profile_failure, tvb, 2, 1, ENC_BIG_ENDIAN);
6128     break;
6129 
6130   case PRIMARY_DOWNSTREAM_CHANGE:
6131     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_prim_ds_change, tvb, 2, 1, ENC_BIG_ENDIAN);
6132     break;
6133 
6134   case DPD_MISMATCH:
6135     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_dpd_mismatch, tvb, 2, 1, ENC_BIG_ENDIAN);
6136     break;
6137 
6138   case NCP_PROFILE_FAILURE:
6139     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_ncp_profile_failure, tvb, 2, 1, ENC_BIG_ENDIAN);
6140     break;
6141 
6142   case PLC_FAILURE:
6143     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_plc_failure, tvb, 2, 1, ENC_BIG_ENDIAN);
6144     break;
6145 
6146   case NCP_PROFILE_RECOVERY:
6147     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_ncp_profile_recovery, tvb, 2, 1, ENC_BIG_ENDIAN);
6148     break;
6149 
6150   case PLC_RECOVERY:
6151     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_plc_recovery, tvb, 2, 1, ENC_BIG_ENDIAN);
6152     break;
6153 
6154   case OFDM_PROFILE_RECOVERY:
6155     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_ofdm_profile_recovery, tvb, 2, 1, ENC_BIG_ENDIAN);
6156     break;
6157 
6158   case OFDMA_PROFILE_FAILURE:
6159     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_ofdma_profile_failure, tvb, 2, 1, ENC_BIG_ENDIAN);
6160     break;
6161 
6162   case MAP_STORAGE_OVERFLOW_INDICATOR:
6163     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_map_storage_overflow_indicator, tvb, 2, 1, ENC_BIG_ENDIAN);
6164     break;
6165 
6166   case MAP_STORAGE_ALMOST_FULL_INDICATOR:
6167     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_map_storage_almost_full_indicator, tvb, 2, 1, ENC_BIG_ENDIAN);
6168     break;
6169 
6170   default:
6171     proto_tree_add_item (tree, hf_docsis_cmstatus_e_t_unknown, tvb, 2, 1, ENC_BIG_ENDIAN);
6172     break;
6173   } /* switch */
6174   return;
6175 }
6176 
6177 static int
6178 dissect_cmstatus (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
6179 {
6180   proto_item *it;
6181   proto_tree *cmstatus_tree;
6182   guint32 transid;
6183   tvbuff_t* next_tvb;
6184 
6185   it = proto_tree_add_item(tree, proto_docsis_cmstatus, tvb, 0, -1, ENC_NA);
6186   cmstatus_tree = proto_item_add_subtree (it, ett_docsis_cmstatus);
6187   proto_tree_add_item_ret_uint (cmstatus_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
6188 
6189   col_add_fstr (pinfo->cinfo, COL_INFO, "CM-STATUS Report: Transaction ID = %u", transid);
6190 
6191   dissect_cmstatus_common (tvb, cmstatus_tree);
6192 
6193   /* Call Dissector TLVs */
6194   next_tvb = tvb_new_subset_remaining(tvb, 3);
6195   dissect_cmstatus_tlv(next_tvb, pinfo, cmstatus_tree);
6196   return tvb_captured_length(tvb);
6197 }
6198 
6199 static int
6200 dissect_cmstatusack (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
6201 {
6202   proto_item *it;
6203   proto_tree *cmstatus_tree;
6204   guint32 transid;
6205 
6206   it = proto_tree_add_item(tree, proto_docsis_cmstatusack, tvb, 0, -1, ENC_NA);
6207   cmstatus_tree = proto_item_add_subtree (it, ett_docsis_cmstatusack);
6208   proto_tree_add_item_ret_uint (cmstatus_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
6209 
6210   col_add_fstr (pinfo->cinfo, COL_INFO, "CM-STATUS Report Acknowledge: Transaction ID = %u", transid);
6211 
6212   dissect_cmstatus_common (tvb, cmstatus_tree);
6213 
6214   return tvb_captured_length(tvb);
6215 }
6216 
6217 static void
6218 dissect_ds_event(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
6219 {
6220   guint8 type;
6221   guint32 length;
6222   proto_tree *event_tree;
6223   proto_item *event_item, *tlv_len_item;
6224   int pos = start;
6225 
6226   while (pos < (start + len))
6227   {
6228     type = tvb_get_guint8 (tvb, pos);
6229     event_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
6230                                             ett_docsis_cmctrl_tlv_ds_event, &event_item,
6231                                             val_to_str(type, cmctrlreq_ds_tlv_vals,
6232                                                        "Unknown TLV (%u)"));
6233     proto_tree_add_uint (event_tree, hf_docsis_cmctrl_ds_type, tvb, pos, 1, type);
6234     pos++;
6235     tlv_len_item = proto_tree_add_item_ret_uint (event_tree, hf_docsis_cmctrl_ds_length, tvb, pos, 1, ENC_NA, &length);
6236     pos++;
6237     proto_item_set_len(event_item, length + 2);
6238 
6239     switch (type)
6240     {
6241     case DS_EVENT_CH_ID:
6242       if (length == 1)
6243       {
6244         proto_tree_add_item (event_tree, hf_docsis_cmctrl_ds_event_ch_id, tvb, pos, length, ENC_BIG_ENDIAN);
6245       }
6246       else
6247       {
6248         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6249       }
6250       break;
6251     case DS_EVENT_MASK:
6252       if (length == 2)
6253       {
6254         proto_tree_add_item (event_tree, hf_docsis_cmctrl_ds_event_mask, tvb, pos, length, ENC_NA);
6255       }
6256       else
6257       {
6258         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6259       }
6260       break;
6261     }          /* switch */
6262 
6263     pos += length;
6264   }            /* while */
6265 }
6266 
6267 static void
6268 dissect_us_event(tvbuff_t * tvb, packet_info* pinfo, proto_tree *tree, int start, guint16 len)
6269 {
6270   guint8 type;
6271   guint32 length;
6272   proto_tree *event_tree;
6273   proto_item *event_item, *tlv_len_item;
6274   int pos = start;
6275 
6276   while (pos < (start + len))
6277   {
6278     type = tvb_get_guint8 (tvb, pos);
6279     event_tree = proto_tree_add_subtree(tree, tvb, pos, -1,
6280                                             ett_docsis_cmctrl_tlv_us_event, &event_item,
6281                                             val_to_str(type, cmctrlreq_us_tlv_vals,
6282                                                        "Unknown TLV (%u)"));
6283     proto_tree_add_uint (event_tree, hf_docsis_cmctrlreq_us_type, tvb, pos, 1, type);
6284     pos++;
6285     tlv_len_item = proto_tree_add_item_ret_uint (event_tree, hf_docsis_cmctrlreq_us_length, tvb, pos, 1, ENC_NA, &length);
6286     pos++;
6287     proto_item_set_len(event_item, length + 2);
6288 
6289     switch (type)
6290     {
6291     case US_EVENT_CH_ID:
6292       if (length == 1)
6293       {
6294         proto_tree_add_item (event_tree, hf_docsis_cmctrl_us_event_ch_id, tvb, pos, length, ENC_BIG_ENDIAN);
6295       }
6296       else
6297       {
6298         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6299       }
6300       break;
6301     case US_EVENT_MASK:
6302       if (length == 2)
6303       {
6304         proto_tree_add_item (event_tree, hf_docsis_cmctrl_us_event_mask, tvb, pos, length, ENC_NA);
6305       }
6306       else
6307       {
6308         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6309       }
6310       break;
6311     }                   /* switch */
6312       pos += length;
6313   }                     /* while */
6314 }
6315 
6316 static void
6317 dissect_cmctrlreq_tlv(tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree)
6318 {
6319   proto_item *it, *tlv_item, *tlv_len_item;
6320   proto_tree *tlv_tree, *tlvtlv_tree;
6321   guint16 pos = 0;
6322   guint8 type;
6323   guint32 length;
6324 
6325   it = proto_tree_add_item(tree, hf_docsis_cmctrlreq_tlv_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
6326   tlv_tree = proto_item_add_subtree (it, ett_docsis_cmctrlreq_tlv);
6327 
6328   while (tvb_reported_length_remaining(tvb, pos) > 0)
6329   {
6330     type = tvb_get_guint8 (tvb, pos);
6331     length = tvb_get_guint8 (tvb, pos + 1);
6332     tlvtlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, length + 2,
6333                                             ett_docsis_cmctrlreq_tlvtlv, &tlv_item,
6334                                             val_to_str(type, cmctrlreq_tlv_vals,
6335                                                        "Unknown TLV (%u)"));
6336     proto_tree_add_uint (tlvtlv_tree, hf_docsis_cmctrlreq_type, tvb, pos, 1, type);
6337     pos++;
6338     tlv_len_item = proto_tree_add_item (tlvtlv_tree, hf_docsis_cmctrlreq_length, tvb, pos, 1, ENC_NA);
6339     pos++;
6340     proto_item_set_len(tlv_item, length + 2);
6341 
6342     switch (type)
6343     {
6344     case CM_CTRL_MUTE:
6345       if (length == 1)
6346       {
6347         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmctrl_tlv_mute, tvb, pos, length, ENC_BIG_ENDIAN);
6348       }
6349       else
6350       {
6351         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6352       }
6353       break;
6354     case CM_CTRL_MUTE_TIMEOUT:
6355       if (length == 4 || length == 1) /* response TLV always with len 1 */
6356       {
6357         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmctrl_tlv_mute_timeout, tvb, pos, length, ENC_BIG_ENDIAN);
6358       }
6359       else
6360       {
6361         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6362       }
6363       break;
6364     case CM_CTRL_REINIT:
6365       if (length == 1)
6366       {
6367         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmctrl_tlv_reinit, tvb, pos, length, ENC_BIG_ENDIAN);
6368       }
6369       else
6370       {
6371         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6372       }
6373       break;
6374     case CM_CTRL_DISABLE_FWD:
6375       if (length == 1)
6376       {
6377         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmctrl_tlv_disable_fwd, tvb, pos, length, ENC_BIG_ENDIAN);
6378       }
6379       else
6380       {
6381         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6382       }
6383       break;
6384     case CM_CTRL_DS_EVENT:
6385       if (length == 1)
6386       {
6387         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmctrl_tlv_ds_event, tvb, pos, length, ENC_NA);
6388       }
6389       else
6390       {
6391         dissect_ds_event(tvb, pinfo, tlvtlv_tree, pos, length);
6392       }
6393       break;
6394     case CM_CTRL_US_EVENT:
6395       if (length == 1)
6396       {
6397         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmctrl_tlv_us_event, tvb, pos, length, ENC_NA);
6398       }
6399       else
6400       {
6401         dissect_us_event(tvb, pinfo, tlvtlv_tree, pos, length);
6402       }
6403       break;
6404     case CM_CTRL_EVENT:
6405       if (length == 2 || length == 1) /* response TLV always with len 1 */
6406       {
6407         proto_tree_add_item (tlvtlv_tree, hf_docsis_cmctrl_tlv_event, tvb, pos, length, ENC_NA);
6408       }
6409       else
6410       {
6411         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6412       }
6413       break;
6414 
6415     } /* switch */
6416 
6417     pos += length;
6418   }
6419 }
6420 
6421 static int
6422 dissect_cmctrlreq(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
6423 {
6424   proto_item *it;
6425   proto_tree *cmctrlreq_tree;
6426   guint32 transid;
6427   tvbuff_t *next_tvb;
6428 
6429   it = proto_tree_add_item (tree, proto_docsis_cmctrlreq, tvb, 0, -1, ENC_NA);
6430   cmctrlreq_tree = proto_item_add_subtree (it, ett_docsis_cmctrlreq);
6431   proto_tree_add_item_ret_uint (cmctrlreq_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
6432 
6433   col_add_fstr (pinfo->cinfo, COL_INFO,
6434                 "CM Control Request: Transaction ID = %u", transid);
6435 
6436   next_tvb = tvb_new_subset_remaining(tvb, 2);
6437   dissect_cmctrlreq_tlv(next_tvb, pinfo, cmctrlreq_tree);
6438   return tvb_captured_length(tvb);
6439 }
6440 
6441 static int
6442 dissect_cmctrlrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
6443 {
6444   proto_item *it;
6445   proto_tree *cmctrlrsp_tree;
6446   guint32 transid;
6447   tvbuff_t *next_tvb;
6448 
6449   it = proto_tree_add_item(tree, proto_docsis_cmctrlrsp, tvb, 0, -1, ENC_NA);
6450   cmctrlrsp_tree = proto_item_add_subtree (it, ett_docsis_cmctrlrsp);
6451   proto_tree_add_item_ret_uint (cmctrlrsp_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &transid);
6452 
6453   col_add_fstr (pinfo->cinfo, COL_INFO,
6454                 "CM Control Response: Transaction ID = %u", transid);
6455 
6456   /* Call Dissector for Appendix C TLVs */
6457   next_tvb = tvb_new_subset_remaining (tvb, 2);
6458   dissect_cmctrlreq_tlv(next_tvb, pinfo, cmctrlrsp_tree);
6459   return tvb_captured_length(tvb);
6460 }
6461 
6462 static int
6463 dissect_regreqmp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
6464 {
6465   proto_item *it;
6466   proto_tree *regreqmp_tree;
6467   tvbuff_t *next_tvb;
6468 
6469   col_set_str(pinfo->cinfo, COL_INFO, "REG-REQ-MP Message:");
6470 
6471   it = proto_tree_add_item(tree, proto_docsis_regreqmp, tvb, 0, -1, ENC_NA);
6472   regreqmp_tree = proto_item_add_subtree (it, ett_docsis_regreqmp);
6473 
6474   proto_tree_add_item (regreqmp_tree, hf_docsis_regreqmp_sid, tvb, 0, 2, ENC_BIG_ENDIAN);
6475   proto_tree_add_item (regreqmp_tree, hf_docsis_regreqmp_number_of_fragments, tvb, 2, 1, ENC_BIG_ENDIAN);
6476   proto_tree_add_item (regreqmp_tree, hf_docsis_regreqmp_fragment_sequence_number, tvb, 3, 1, ENC_BIG_ENDIAN);
6477 
6478   /* Call Dissector for Appendix C TLVs */
6479   next_tvb = tvb_new_subset_remaining (tvb, 4);
6480   call_dissector (docsis_tlv_handle, next_tvb, pinfo, regreqmp_tree);
6481   return tvb_captured_length(tvb);
6482 }
6483 
6484 static int
6485 dissect_regrspmp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
6486 {
6487   proto_item *it, *reassembled_item;
6488   proto_tree *regrspmp_tree, *reassembled_tree;
6489   guint sid, number_of_fragments, fragment_sequence_number;
6490 
6491   tvbuff_t *next_tvb;
6492 
6493   col_set_str(pinfo->cinfo, COL_INFO, "REG-RSP-MP Message");
6494   /* Make sure embedded UCD does not overwrite REGRSPMP info */
6495   col_set_fence(pinfo->cinfo, COL_INFO);
6496 
6497   it = proto_tree_add_item(tree, proto_docsis_regrspmp, tvb, 0, -1, ENC_NA);
6498   regrspmp_tree = proto_item_add_subtree (it, ett_docsis_regrspmp);
6499 
6500   proto_tree_add_item_ret_uint (regrspmp_tree, hf_docsis_regrspmp_sid, tvb, 0, 2, ENC_BIG_ENDIAN, &sid);
6501   proto_tree_add_item (regrspmp_tree, hf_docsis_regrspmp_response, tvb, 2, 1, ENC_BIG_ENDIAN);
6502   proto_tree_add_item_ret_uint (regrspmp_tree, hf_docsis_regrspmp_number_of_fragments, tvb, 3, 1, ENC_BIG_ENDIAN, &number_of_fragments);
6503   proto_tree_add_item_ret_uint (regrspmp_tree, hf_docsis_regrspmp_fragment_sequence_number, tvb, 4, 1, ENC_BIG_ENDIAN, &fragment_sequence_number);
6504 
6505   col_add_fstr(pinfo->cinfo, COL_INFO, " (fragment %d):", fragment_sequence_number);
6506   /* Make sure embedded UCD does not overwrite REGRSPMP info */
6507   col_set_fence(pinfo->cinfo, COL_INFO);
6508 
6509   if(number_of_fragments > 1) {
6510      pinfo->fragmented = TRUE;
6511 
6512      fragment_head* reassembled_tlv = NULL;
6513      reassembled_tlv = fragment_add_seq_check(&docsis_tlv_reassembly_table,
6514                                   tvb, 5, pinfo,
6515                                   sid, NULL, /* ID for fragments belonging together */
6516                                   fragment_sequence_number -1, /* Sequence number starts at 0 */
6517                                   tvb_reported_length_remaining(tvb, 5), /* fragment length - to the end */
6518                                   (fragment_sequence_number != number_of_fragments)); /* More fragments? */
6519 
6520      if (reassembled_tlv) {
6521        tvbuff_t *tlv_tvb = NULL;
6522 
6523        reassembled_item = proto_tree_add_item(regrspmp_tree, hf_docsis_tlv_reassembled, tvb, 0, -1, ENC_NA);
6524        reassembled_tree = proto_item_add_subtree (reassembled_item, ett_docsis_tlv_reassembled );
6525 
6526 
6527        tlv_tvb = process_reassembled_data(tvb, 5, pinfo, "Reassembled TLV", reassembled_tlv, &docsis_tlv_frag_items,
6528                                                   NULL, reassembled_tree);
6529 
6530        if (tlv_tvb && tvb_reported_length(tlv_tvb) > 0) {
6531          call_dissector (docsis_tlv_handle, tlv_tvb, pinfo, reassembled_tree);
6532        }
6533      }
6534 
6535   } else {
6536     /* Call Dissector for Appendix C TLVs */
6537     next_tvb = tvb_new_subset_remaining (tvb, 5);
6538     call_dissector (docsis_tlv_handle, next_tvb, pinfo, regrspmp_tree);
6539   }
6540 
6541   return tvb_captured_length(tvb);
6542 }
6543 
6544 static void
6545 dissect_emrsp_tlv (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
6546 {
6547   proto_item *it, *tlv_item;
6548   proto_tree *tlv_tree, *tlvtlv_tree;
6549   guint pos = 0;
6550   guint length;
6551   guint8 type;
6552 
6553   it = proto_tree_add_item(tree, hf_docsis_emrsp_tlv_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
6554   tlv_tree = proto_item_add_subtree (it, ett_docsis_emrsp_tlv);
6555 
6556   while (tvb_reported_length_remaining(tvb, pos) > 0)
6557   {
6558     type = tvb_get_guint8 (tvb, pos);
6559     length = tvb_get_guint8 (tvb, pos + 1);
6560     tlvtlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, length + 2,
6561                                             ett_docsis_emrsp_tlvtlv, &tlv_item,
6562                                             val_to_str(type, emrsp_tlv_vals,
6563                                                        "Unknown TLV (%u)"));
6564     proto_tree_add_item (tlvtlv_tree, hf_docsis_emrsp_tlv_type, tvb, pos, 1, ENC_BIG_ENDIAN);
6565     pos++;
6566     proto_tree_add_item (tlvtlv_tree, hf_docsis_emrsp_tlv_length, tvb, pos, 1, ENC_BIG_ENDIAN);
6567     pos++;
6568 
6569 
6570     switch (type)
6571     {
6572     case EM_HOLDOFF_TIMER:
6573       proto_tree_add_item (tlvtlv_tree, hf_docsis_emrsp_tlv_holdoff_timer, tvb, pos, length, ENC_BIG_ENDIAN);
6574       break;
6575     default:
6576       proto_tree_add_item (tlvtlv_tree, hf_docsis_emrsp_tlv_unknown, tvb, pos - 2, length+2, ENC_NA);
6577       expert_add_info_format(pinfo, tlv_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown TLV: %u", type);
6578       break;
6579     } /* switch */
6580     pos += length;
6581   } /* while */
6582 }
6583 
6584 static int
6585 dissect_emreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data  _U_)
6586 {
6587   proto_item *it;
6588   proto_tree *em_tree;
6589 
6590   guint32 trans_id, req_power_mode;
6591 
6592   it = proto_tree_add_item(tree, proto_docsis_emreq, tvb, 0, -1, ENC_NA);
6593   em_tree = proto_item_add_subtree (it, ett_docsis_emreq);
6594   proto_tree_add_item_ret_uint (em_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &trans_id);
6595   proto_tree_add_item_ret_uint (em_tree, hf_docsis_emreq_req_power_mode, tvb, 2, 1, ENC_BIG_ENDIAN, &req_power_mode);
6596   proto_tree_add_item (em_tree, hf_docsis_emreq_reserved, tvb, 3, 1, ENC_BIG_ENDIAN);
6597 
6598   col_add_fstr (pinfo->cinfo, COL_INFO, "EM-REQ: Transaction ID: %u, Requested Power Mode: %s (%u)", trans_id,
6599                               val_to_str(req_power_mode, emreq_req_power_mode_vals, "Unknown Requested Power Mode (%u)"), req_power_mode);
6600 
6601   return tvb_captured_length(tvb);
6602 }
6603 
6604 static int
6605 dissect_emrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data  _U_)
6606 {
6607   proto_item *it;
6608   proto_tree *em_tree;
6609   tvbuff_t *next_tvb;
6610 
6611   guint32 trans_id, rsp_code;
6612 
6613   it = proto_tree_add_item(tree, proto_docsis_emrsp, tvb, 0, -1, ENC_NA);
6614   em_tree = proto_item_add_subtree (it, ett_docsis_emrsp);
6615   proto_tree_add_item_ret_uint (em_tree, hf_docsis_mgt_tranid, tvb, 0, 2, ENC_BIG_ENDIAN, &trans_id);
6616   proto_tree_add_item_ret_uint (em_tree, hf_docsis_emrsp_rsp_code, tvb, 2, 1, ENC_BIG_ENDIAN, &rsp_code);
6617   proto_tree_add_item (em_tree, hf_docsis_emrsp_reserved, tvb, 3, 1, ENC_BIG_ENDIAN);
6618 
6619   col_add_fstr (pinfo->cinfo, COL_INFO, "EM-RSP: Transaction ID: %u, Response Code: %s (%u)", trans_id,
6620                               val_to_str(rsp_code, emrsp_rsp_code_vals, "Unknown Response Code (%u)"), rsp_code);
6621 
6622   /* Call Dissector TLVs */
6623   if(tvb_reported_length_remaining(tvb, 4) > 0 )
6624   {
6625     next_tvb = tvb_new_subset_remaining(tvb, 4);
6626     dissect_emrsp_tlv(next_tvb, pinfo, em_tree);
6627   }
6628 
6629   return tvb_captured_length(tvb);
6630 }
6631 
6632 static void
6633 dissect_subcarrier_assignment_range_list(tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree, guint16 pos, guint32 len)
6634 {
6635   proto_item* type_item;
6636   guint32 i, subcarrier_assignment_type;
6637 
6638   type_item = proto_tree_add_item_ret_uint (tree, hf_docsis_ocd_tlv_subc_assign_type, tvb, pos, 1, ENC_BIG_ENDIAN, &subcarrier_assignment_type);
6639   proto_tree_add_item (tree, hf_docsis_ocd_tlv_subc_assign_value, tvb, pos, 1, ENC_BIG_ENDIAN);
6640   proto_tree_add_item (tree, hf_docsis_ocd_subc_assign_subc_type, tvb, pos, 1, ENC_BIG_ENDIAN);
6641   pos++;
6642 
6643   switch (subcarrier_assignment_type) {
6644     case SUBCARRIER_ASSIGNMENT_RANGE_CONT:
6645     case SUBCARRIER_ASSIGNMENT_RANGE_SKIPBY1:
6646       proto_tree_add_item (tree, hf_docsis_ocd_subc_assign_range, tvb, pos, 4, ENC_BIG_ENDIAN);
6647       break;
6648     case SUBCARRIER_ASSIGNMENT_LIST:
6649       for (i = 0; i < len/2; ++i) {
6650         proto_tree_add_item (tree, hf_docsis_ocd_subc_assign_index, tvb, pos, 2, ENC_BIG_ENDIAN);
6651         pos += 2;
6652       }
6653       break;
6654     default:
6655       expert_add_info_format(pinfo, type_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown subcarrier assignment type %d", subcarrier_assignment_type);
6656       break;
6657   }
6658 }
6659 
6660 static void
6661 dissect_ocd_tlv (tvbuff_t * tvb, packet_info* pinfo, proto_tree * tree)
6662 {
6663   proto_item *it, *tlv_item, *tlv_len_item;
6664   proto_tree *tlv_tree, *tlvtlv_tree;
6665   guint16 pos = 0;
6666   guint8 type;
6667   guint32 length;
6668 
6669   it = proto_tree_add_item(tree, hf_docsis_ocd_tlv_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
6670   tlv_tree = proto_item_add_subtree (it, ett_docsis_ocd_tlv);
6671 
6672   while (tvb_reported_length_remaining(tvb, pos) > 0)
6673   {
6674     type = tvb_get_guint8 (tvb, pos);
6675     tlvtlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, -1,
6676                                             ett_docsis_ocd_tlvtlv, &tlv_item,
6677                                             val_to_str(type, ocd_tlv_vals,
6678                                                        "Unknown TLV (%u)"));
6679     proto_tree_add_uint (tlvtlv_tree, hf_docsis_ocd_type, tvb, pos, 1, type);
6680     pos++;
6681     tlv_len_item = proto_tree_add_item_ret_uint (tlvtlv_tree, hf_docsis_ocd_length, tvb, pos, 1, ENC_NA, &length);
6682     pos++;
6683     proto_item_set_len(tlv_item, length + 2);
6684 
6685     switch (type)
6686     {
6687     case DISCRETE_FOURIER_TRANSFORM_SIZE:
6688       if (length == 1)
6689       {
6690         proto_tree_add_item (tlvtlv_tree, hf_docsis_ocd_tlv_four_trans_size, tvb, pos, 1, ENC_BIG_ENDIAN);
6691       }
6692       else
6693       {
6694         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6695       }
6696       break;
6697     case CYCLIC_PREFIX:
6698       if (length == 1)
6699       {
6700         proto_tree_add_item (tlvtlv_tree, hf_docsis_ocd_tlv_cycl_pref, tvb, pos, 1, ENC_BIG_ENDIAN);
6701       }
6702       else
6703       {
6704         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6705       }
6706       break;
6707     case ROLL_OFF:
6708       if (length == 1)
6709       {
6710         proto_tree_add_item (tlvtlv_tree, hf_docsis_ocd_tlv_roll_off, tvb, pos, 1, ENC_BIG_ENDIAN);
6711       }
6712       else
6713       {
6714         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6715       }
6716       break;
6717     case OFDM_SPECTRUM_LOCATION:
6718       if (length == 4)
6719       {
6720         proto_tree_add_item (tlvtlv_tree, hf_docsis_ocd_tlv_ofdm_spec_loc, tvb, pos, 4, ENC_BIG_ENDIAN);
6721       }
6722       else
6723       {
6724         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6725       }
6726       break;
6727     case TIME_INTERLEAVING_DEPTH:
6728       if (length == 1)
6729       {
6730         proto_tree_add_item (tlvtlv_tree, hf_docsis_ocd_tlv_time_int_depth, tvb, pos, 1, ENC_BIG_ENDIAN);
6731       }
6732       else
6733       {
6734         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6735       }
6736       break;
6737     case SUBCARRIER_ASSIGNMENT_RANGE_LIST:
6738       if (length >= 5)
6739       {
6740         dissect_subcarrier_assignment_range_list(tvb, pinfo, tlvtlv_tree, pos, length);
6741       }
6742       else
6743       {
6744         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6745       }
6746       break;
6747     case PRIMARY_CAPABILITY_INDICATOR:
6748       if (length == 1)
6749       {
6750         proto_tree_add_item (tlvtlv_tree, hf_docsis_ocd_tlv_prim_cap_ind, tvb, pos, 1, ENC_BIG_ENDIAN);
6751       }
6752       else
6753       {
6754         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6755       }
6756       break;
6757     default:
6758       proto_tree_add_item (tlvtlv_tree, hf_docsis_ocd_tlv_unknown, tvb, pos - 2, length+2, ENC_NA);
6759       break;
6760     } /* switch */
6761     pos += length;
6762   } /* while */
6763 }
6764 
6765 static int
6766 dissect_ocd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
6767 {
6768   proto_item *it;
6769   proto_tree *ocd_tree;
6770   tvbuff_t *next_tvb;
6771   guint32 downstream_channel_id, configuration_change_count;
6772 
6773   it = proto_tree_add_item(tree, proto_docsis_ocd, tvb, 0, -1, ENC_NA);
6774   ocd_tree = proto_item_add_subtree (it, ett_docsis_ocd);
6775 
6776   proto_tree_add_item_ret_uint (ocd_tree, hf_docsis_mgt_down_chid, tvb, 0, 1, ENC_BIG_ENDIAN, &downstream_channel_id);
6777   proto_tree_add_item_ret_uint (ocd_tree, hf_docsis_ocd_ccc, tvb, 1, 1, ENC_BIG_ENDIAN, &configuration_change_count);
6778 
6779   col_add_fstr (pinfo->cinfo, COL_INFO, "OCD: DS CH ID: %u, CCC: %u", downstream_channel_id, configuration_change_count);
6780 
6781   /* Call Dissector TLVs */
6782   next_tvb = tvb_new_subset_remaining(tvb, 2);
6783   dissect_ocd_tlv(next_tvb, pinfo, ocd_tree);
6784 
6785   return tvb_captured_length(tvb);
6786 }
6787 
6788 static void
6789 dissect_dpd_subcarrier_assignment_range_list(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, guint pos, guint len)
6790 {
6791   guint32 i, subcarrier_assignment_type;
6792   proto_item* type_item;
6793   guint modulation;
6794 
6795   type_item = proto_tree_add_item_ret_uint (tree, hf_docsis_dpd_tlv_subc_assign_type, tvb, pos, 1, ENC_BIG_ENDIAN, &subcarrier_assignment_type);
6796   proto_tree_add_item (tree, hf_docsis_dpd_tlv_subc_assign_value, tvb, pos, 1, ENC_BIG_ENDIAN);
6797   proto_tree_add_item (tree, hf_docsis_dpd_tlv_subc_assign_reserved, tvb, pos, 1, ENC_BIG_ENDIAN);
6798   proto_tree_add_item_ret_uint (tree, hf_docsis_dpd_tlv_subc_assign_modulation, tvb, pos, 1, ENC_BIG_ENDIAN, &modulation);
6799   col_append_str(pinfo->cinfo, COL_INFO, val_to_str(modulation, docsis_dpd_subc_assign_modulation_str, "%s"));
6800   pos++;
6801 
6802   switch (subcarrier_assignment_type)
6803   {
6804     case SUBCARRIER_ASSIGNMENT_RANGE_CONT:
6805     case SUBCARRIER_ASSIGNMENT_RANGE_SKIPBY1:
6806       proto_tree_add_item (tree, hf_docsis_dpd_subc_assign_range, tvb, pos, 4, ENC_BIG_ENDIAN);
6807       break;
6808     case SUBCARRIER_ASSIGNMENT_LIST:
6809       for (i = 0; i < len/2; ++i) {
6810         proto_tree_add_item (tree, hf_docsis_dpd_subc_assign_index, tvb, pos, 2, ENC_BIG_ENDIAN);
6811         pos += 2;
6812       }
6813       break;
6814     default:
6815       expert_add_info_format(pinfo, type_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown subcarrier assignment type: %u", subcarrier_assignment_type);
6816       break;
6817   }
6818 }
6819 
6820 static void
6821 dissect_dpd_subcarrier_assignment_vector(tvbuff_t * tvb, proto_tree * tree, guint start, guint len)
6822 {
6823   guint32 subcarrier_assignment_vector_oddness;
6824   guint vector_index;
6825 
6826   proto_tree_add_item_ret_uint (tree, hf_docsis_dpd_tlv_subc_assign_vector_oddness, tvb, start, 1, ENC_BIG_ENDIAN, &subcarrier_assignment_vector_oddness);
6827   proto_tree_add_item (tree, hf_docsis_dpd_tlv_subc_assign_vector_reserved, tvb, start, 1, ENC_BIG_ENDIAN);
6828   proto_tree_add_item (tree, hf_docsis_dpd_tlv_subc_assign_vector_subc_start, tvb, start, 2, ENC_BIG_ENDIAN);
6829 
6830   for(vector_index = 0; vector_index < len; ++vector_index)
6831   {
6832     proto_tree_add_item (tree, hf_docsis_dpd_tlv_subc_assign_vector_modulation_odd, tvb, start + 2 + vector_index, 1, ENC_BIG_ENDIAN);
6833     if (!((vector_index == len -1) && subcarrier_assignment_vector_oddness))
6834     {
6835       proto_tree_add_item (tree, hf_docsis_dpd_tlv_subc_assign_vector_modulation_even, tvb, start + 2 + vector_index, 1, ENC_BIG_ENDIAN);
6836     }
6837   }
6838 }
6839 
6840 
6841 static void
6842 dissect_dpd_tlv (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
6843 {
6844   proto_item *it, *tlv_item, *tlv_len_item;
6845   proto_tree *tlv_tree, *tlvtlv_tree;
6846   guint pos = 0;
6847   guint length;
6848   guint8 type;
6849   guint first_subc_assign_list = 1;
6850 
6851   it = proto_tree_add_item(tree, hf_docsis_dpd_tlv_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
6852   tlv_tree = proto_item_add_subtree (it, ett_docsis_dpd_tlv);
6853 
6854   while (tvb_reported_length_remaining(tvb, pos) > 0)
6855   {
6856     type = tvb_get_guint8 (tvb, pos);
6857     if ( type == SUBCARRIER_ASSIGNMENT_VECTOR)
6858     {
6859       /* For this type, length is 2 bytes instead of 1 */
6860       length = tvb_get_ntohs (tvb, pos + 1);
6861     } else {
6862       length = tvb_get_guint8 (tvb, pos + 1);
6863     }
6864 
6865     tlvtlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, length + 2,
6866                                             ett_docsis_dpd_tlvtlv, &tlv_item,
6867                                             val_to_str(type, dpd_tlv_vals,
6868                                                        "Unknown TLV (%u)"));
6869     proto_tree_add_uint (tlvtlv_tree, hf_docsis_dpd_type, tvb, pos, 1, type);
6870     pos++;
6871     if (type == SUBCARRIER_ASSIGNMENT_VECTOR)
6872     {
6873       /* For this type, length is 2 bytes instead of 1 */
6874       tlv_len_item = proto_tree_add_item (tlvtlv_tree, hf_docsis_dpd_length, tvb, pos, 2, ENC_BIG_ENDIAN);
6875       pos += 2;
6876     } else {
6877       tlv_len_item = proto_tree_add_item (tlvtlv_tree, hf_docsis_dpd_length, tvb, pos, 1, ENC_NA);
6878       pos++;
6879     }
6880 
6881     switch (type)
6882     {
6883     case SUBCARRIER_ASSIGNMENT_RANGE_LIST:
6884       if (length >= 5)
6885       {
6886         if(first_subc_assign_list) {
6887           col_append_str(pinfo->cinfo, COL_INFO, ", Modulation: ");
6888           first_subc_assign_list = 0;
6889         } else {
6890           col_append_str(pinfo->cinfo, COL_INFO, " | ");
6891         }
6892         dissect_dpd_subcarrier_assignment_range_list(tvb, pinfo, tlvtlv_tree, pos, length);
6893       }
6894       else
6895       {
6896         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6897       }
6898       break;
6899     case SUBCARRIER_ASSIGNMENT_VECTOR:
6900       if (length >=2)
6901       {
6902         dissect_dpd_subcarrier_assignment_vector(tvb, tlvtlv_tree, pos, length);
6903       }
6904       else
6905       {
6906         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6907       }
6908       break;
6909     default:
6910       proto_tree_add_item (tlvtlv_tree, hf_docsis_dpd_tlv_unknown, tvb, pos - 2, length+2, ENC_NA);
6911       expert_add_info_format(pinfo, tlv_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown TLV: %u", type);
6912       break;
6913     } /* switch */
6914     pos += length;
6915   } /* while */
6916 }
6917 
6918 static int
6919 dissect_dpd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data  _U_)
6920 {
6921   proto_item *it;
6922   proto_tree *dpd_tree;
6923   tvbuff_t *next_tvb;
6924 
6925   guint32 downstream_channel_id, profile_identifier, configuration_change_count;
6926 
6927   it = proto_tree_add_item(tree, proto_docsis_dpd, tvb, 0, -1, ENC_NA);
6928   dpd_tree = proto_item_add_subtree (it, ett_docsis_dpd);
6929   proto_tree_add_item_ret_uint (dpd_tree, hf_docsis_mgt_down_chid, tvb, 0, 1, ENC_BIG_ENDIAN, &downstream_channel_id);
6930   proto_tree_add_item_ret_uint (dpd_tree, hf_docsis_dpd_prof_id, tvb, 1, 1, ENC_BIG_ENDIAN, &profile_identifier);
6931   proto_tree_add_item_ret_uint (dpd_tree, hf_docsis_dpd_ccc, tvb, 2, 1, ENC_BIG_ENDIAN, &configuration_change_count);
6932 
6933   col_add_fstr (pinfo->cinfo, COL_INFO, "DPD: DS CH ID: %u, Profile ID: %u, CCC: %u", downstream_channel_id, profile_identifier, configuration_change_count);
6934 
6935   /* Call Dissector TLVs */
6936   next_tvb = tvb_new_subset_remaining(tvb, 3);
6937   dissect_dpd_tlv(next_tvb, pinfo, dpd_tree);
6938 
6939   return tvb_captured_length(tvb);
6940 }
6941 
6942 static int
6943 dissect_type51ucd(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
6944 {
6945   return dissect_any_ucd(tvb, pinfo, tree, proto_docsis_type51ucd, MGT_TYPE51UCD);
6946 }
6947 
6948 static void
6949 dissect_optreq_tlv_rxmer_thresholding_parameters (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
6950 {
6951   proto_item *it, *tlv_item, *tlv_len_item;
6952   proto_tree *tlv_tree, *tlvtlv_tree;
6953   guint pos = 0;
6954   guint length;
6955   guint8 type;
6956 
6957   it = proto_tree_add_item(tree, hf_docsis_optreq_tlv_xrmer_thresh_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
6958   tlv_tree = proto_item_add_subtree (it, ett_docsis_optreq_tlv_rxmer_thresh_params);
6959 
6960   while (tvb_reported_length_remaining(tvb, pos) > 0)
6961   {
6962     type = tvb_get_guint8 (tvb, pos);
6963     length = tvb_get_guint8 (tvb, pos + 1);
6964     tlvtlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, length + 2,
6965                                             ett_docsis_optreq_tlv_rxmer_thresh_params_tlv, &tlv_item,
6966                                             val_to_str(type, optreq_tlv_rxmer_thresh_params_vals,
6967                                                        "Unknown TLV (%u)"));
6968     proto_tree_add_uint (tlvtlv_tree, hf_docsis_optreq_xmer_thresh_params_type, tvb, pos, 1, type);
6969     pos++;
6970     tlv_len_item = proto_tree_add_item (tlvtlv_tree, hf_docsis_optreq_xmer_thresh_params_length, tvb, pos, 1, ENC_NA);
6971     pos++;
6972 
6973 
6974     switch (type)
6975     {
6976     case OPT_REQ_RXMER_THRESH_PARAMS_MODULATION_ORDER:
6977       if (length == 1)
6978       {
6979         proto_tree_add_item(tlvtlv_tree, hf_docsis_optreq_tlv_xrmer_thresh_data_mod_order, tvb, pos, length, ENC_NA);
6980       }
6981       else
6982       {
6983         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
6984       }
6985       break;
6986     default:
6987       proto_tree_add_item (tlvtlv_tree, hf_docsis_optreq_tlv_unknown, tvb, pos - 2, length+2, ENC_NA);
6988       expert_add_info_format(pinfo, tlv_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown TLV: %u", type);
6989       break;
6990     } /* switch */
6991     pos += length;
6992   } /* while */
6993 }
6994 
6995 static void
6996 dissect_optreq_tlv (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
6997 {
6998   proto_item *it, *tlv_item, *tlv_len_item;
6999   proto_tree *tlv_tree, *tlvtlv_tree;
7000   guint pos = 0;
7001   guint length;
7002   guint8 type;
7003   tvbuff_t *next_tvb;
7004 
7005   it = proto_tree_add_item(tree, hf_docsis_optreq_tlv_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
7006   tlv_tree = proto_item_add_subtree (it, ett_docsis_optreq_tlv);
7007 
7008   while (tvb_reported_length_remaining(tvb, pos) > 0)
7009   {
7010     type = tvb_get_guint8 (tvb, pos);
7011     length = tvb_get_guint8 (tvb, pos + 1);
7012     tlvtlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, length + 2,
7013                                             ett_docsis_optreq_tlvtlv, &tlv_item,
7014                                             val_to_str(type, optreq_tlv_vals,
7015                                                        "Unknown TLV (%u)"));
7016     proto_tree_add_uint (tlvtlv_tree, hf_docsis_optreq_type, tvb, pos, 1, type);
7017     pos++;
7018     tlv_len_item = proto_tree_add_item (tlvtlv_tree, hf_docsis_optreq_length, tvb, pos, 1, ENC_NA);
7019     pos++;
7020 
7021 
7022     switch (type)
7023     {
7024     case OPT_REQ_REQ_STAT:
7025       if (length == 1)
7026       {
7027 
7028          static int * const req_stat[] = {
7029            &hf_docsis_optreq_reqstat_rxmer_stat_subc,
7030            &hf_docsis_optreq_reqstat_rxmer_subc_threshold_comp,
7031            &hf_docsis_optreq_reqstat_snr_marg_cand_prof,
7032            &hf_docsis_optreq_reqstat_codew_stat_cand_prof,
7033            &hf_docsis_optreq_reqstat_codew_thresh_comp_cand_prof,
7034            &hf_docsis_optreq_reqstat_ncp_field_stat,
7035            &hf_docsis_optreq_reqstat_ncp_crc_thresh_comp,
7036            &hf_docsis_optreq_reqstat_reserved,
7037            NULL
7038          };
7039 
7040          proto_tree_add_bitmask_list(tlvtlv_tree, tvb, pos, length, req_stat, ENC_BIG_ENDIAN);
7041       }
7042       else
7043       {
7044         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
7045       }
7046       break;
7047     case OPT_REQ_RXMER_THRESH_PARAMS:
7048       next_tvb = tvb_new_subset_length(tvb, pos, length);
7049       dissect_optreq_tlv_rxmer_thresholding_parameters(next_tvb, pinfo, tlvtlv_tree);
7050       break;
7051     default:
7052       proto_tree_add_item (tlvtlv_tree, hf_docsis_optreq_tlv_unknown, tvb, pos - 2, length+2, ENC_NA);
7053       expert_add_info_format(pinfo, tlv_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown TLV: %u", type);
7054       break;
7055     } /* switch */
7056     pos += length;
7057   } /* while */
7058 }
7059 
7060 static int
7061 dissect_optreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data  _U_)
7062 {
7063   proto_item *it;
7064   proto_tree *opt_tree;
7065   tvbuff_t *next_tvb;
7066 
7067   guint32 downstream_channel_id, profile_identifier, opcode;
7068 
7069   it = proto_tree_add_item(tree, proto_docsis_optreq, tvb, 0, -1, ENC_NA);
7070   opt_tree = proto_item_add_subtree (it, ett_docsis_optreq);
7071   proto_tree_add_item (opt_tree, hf_docsis_optreq_reserved, tvb, 0, 2, ENC_BIG_ENDIAN);
7072   proto_tree_add_item_ret_uint (opt_tree, hf_docsis_mgt_down_chid, tvb, 2, 1, ENC_BIG_ENDIAN, &downstream_channel_id);
7073   proto_tree_add_item_ret_uint (opt_tree, hf_docsis_optreq_prof_id, tvb, 3, 1, ENC_BIG_ENDIAN, &profile_identifier);
7074   proto_tree_add_item_ret_uint (opt_tree, hf_docsis_optreq_opcode, tvb, 4, 1, ENC_BIG_ENDIAN, &opcode);
7075 
7076   col_add_fstr (pinfo->cinfo, COL_INFO, "OPT-REQ: DS CH ID: %u, Profile ID: %s (%u), Opcode: %s (%u)", downstream_channel_id,
7077                               val_to_str(profile_identifier, profile_id_vals, "Unknown Profile ID (%u)"), profile_identifier,
7078                               val_to_str(opcode, opt_opcode_vals, "Unknown Opcode (%u)"), opcode);
7079 
7080   /* Call Dissector TLVs */
7081   if(tvb_reported_length_remaining(tvb, 5) > 0 )
7082   {
7083     next_tvb = tvb_new_subset_remaining(tvb, 5);
7084     dissect_optreq_tlv(next_tvb, pinfo, opt_tree);
7085   }
7086 
7087   return tvb_reported_length(tvb);
7088 }
7089 
7090 static void
7091 dissect_optrsp_tlv_rxmer_and_snr_margin_data (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
7092 {
7093   proto_item *it, *tlv_item, *tlv_len_item;
7094   proto_tree *tlv_tree, *tlvtlv_tree;
7095   guint pos = 0;
7096   guint length;
7097   guint8 type;
7098   guint number_of_subcarriers = 0;
7099   guint i;
7100 
7101   it = proto_tree_add_item(tree, hf_docsis_optrsp_tlv_xrmer_snr_margin_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
7102   tlv_tree = proto_item_add_subtree (it, ett_docsis_optrsp_tlv_rxmer_snr_margin_data);
7103 
7104   while (tvb_reported_length_remaining(tvb, pos) > 0)
7105   {
7106     type = tvb_get_guint8 (tvb, pos);
7107     length = tvb_get_ntohs ( tvb, pos + 1);
7108     tlvtlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, length + 2,
7109                                             ett_docsis_optrsp_tlv_rxmer_snr_margin_tlv, &tlv_item,
7110                                             val_to_str(type, optrsp_tlv_rxmer_snr_margin_vals,
7111                                                        "Unknown TLV (%u)"));
7112     proto_tree_add_uint (tlvtlv_tree, hf_docsis_optrsp_xmer_snr_margin_type, tvb, pos, 1, type);
7113     pos++;
7114     tlv_len_item = proto_tree_add_item (tlvtlv_tree, hf_docsis_optrsp_xmer_snr_margin_length, tvb, pos, 2, ENC_NA);
7115     pos+=2;
7116 
7117 
7118     switch (type)
7119     {
7120     case OPT_RSP_RXMER_PER_SUBCARRIER:
7121       if ((guint) tvb_reported_length_remaining(tvb, pos) < length)
7122       {
7123         number_of_subcarriers = tvb_reported_length_remaining(tvb,pos);
7124       } else {
7125         number_of_subcarriers = length;
7126       }
7127       for(i=0; i < number_of_subcarriers;++i)
7128       {
7129         proto_tree_add_item(tlvtlv_tree, hf_docsis_optrsp_tlv_xrmer_snr_margin_data_rxmer_subc, tvb, pos+i, 1, ENC_NA);
7130       }
7131       break;
7132     case OPT_RSP_SNR_MARGIN:
7133       if (length == 1)
7134       {
7135         proto_tree_add_item(tlvtlv_tree, hf_docsis_optrsp_tlv_rxmer_snr_margin_data_snr_margin, tvb, pos, length, ENC_NA);
7136       }
7137       else
7138       {
7139         expert_add_info_format(pinfo, tlv_len_item, &ei_docsis_mgmt_tlvlen_bad, "Wrong TLV length: %u", length);
7140       }
7141       break;
7142     default:
7143       proto_tree_add_item (tlvtlv_tree, hf_docsis_optrsp_tlv_unknown, tvb, pos - 2, length+2, ENC_NA);
7144       expert_add_info_format(pinfo, tlv_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown TLV: %u", type);
7145       break;
7146     } /* switch */
7147     pos += length;
7148   } /* while */
7149 }
7150 
7151 static void
7152 dissect_optrsp_tlv (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
7153 {
7154   proto_item *it, *tlv_item;
7155   proto_tree *tlv_tree;
7156   guint pos = 0;
7157   guint length;
7158   guint8 type;
7159   tvbuff_t *next_tvb;
7160 
7161 
7162   it = proto_tree_add_item(tree, hf_docsis_optrsp_tlv_data, tvb, 0, tvb_reported_length(tvb), ENC_NA);
7163   tlv_tree = proto_item_add_subtree (it, ett_docsis_optrsp_tlv);
7164 
7165   while (tvb_reported_length_remaining(tvb, pos) > 0)
7166   {
7167     type = tvb_get_guint8 (tvb, pos);
7168     tlv_tree = proto_tree_add_subtree(tlv_tree, tvb, pos, -1,
7169                                             ett_docsis_optrsp_tlvtlv, &tlv_item,
7170                                             val_to_str(type, optrsp_tlv_vals,
7171                                                        "Unknown TLV (%u)"));
7172     proto_tree_add_uint (tlv_tree, hf_docsis_optrsp_type, tvb, pos, 1, type);
7173     pos++;
7174     proto_tree_add_item_ret_uint (tlv_tree, hf_docsis_optrsp_length, tvb, pos, 2, ENC_NA, &length);
7175     pos+=2;
7176 
7177     switch (type)
7178     {
7179     case OPT_RSP_RXMER_AND_SNR_MARGIN_DATA:
7180       if ((guint) tvb_reported_length_remaining(tvb, pos) < length) {
7181         next_tvb = tvb_new_subset_remaining(tvb, pos);
7182       } else {
7183         next_tvb = tvb_new_subset_length(tvb, pos, length);
7184       }
7185       dissect_optrsp_tlv_rxmer_and_snr_margin_data(next_tvb, pinfo, tlv_tree);
7186       break;
7187     default:
7188       proto_tree_add_item (tlv_tree, hf_docsis_dpd_tlv_unknown, tvb, pos - 2, length+2, ENC_NA);
7189       expert_add_info_format(pinfo, tlv_item, &ei_docsis_mgmt_tlvtype_unknown, "Unknown TLV: %u", type);
7190       break;
7191     } /* switch */
7192     pos += length;
7193   } /* while */
7194 }
7195 
7196 static int
7197 dissect_optrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data  _U_)
7198 {
7199   proto_item *it;
7200   proto_tree *opt_tree;
7201   address save_src, save_dst;
7202   guint version, multipart, number_of_fragments, fragment_sequence_number;
7203   tvbuff_t *tlv_tvb = NULL;
7204 
7205   guint32 downstream_channel_id, profile_identifier, status;
7206 
7207   it = proto_tree_add_item(tree, proto_docsis_optrsp, tvb, 0, -1, ENC_NA);
7208   opt_tree = proto_item_add_subtree (it, ett_docsis_optrsp);
7209   proto_tree_add_item (opt_tree, hf_docsis_optrsp_reserved, tvb, 0, 2, ENC_BIG_ENDIAN);
7210   proto_tree_add_item_ret_uint (opt_tree, hf_docsis_mgt_down_chid, tvb, 2, 1, ENC_BIG_ENDIAN, &downstream_channel_id);
7211   proto_tree_add_item_ret_uint (opt_tree, hf_docsis_optrsp_prof_id, tvb, 3, 1, ENC_BIG_ENDIAN, &profile_identifier);
7212   proto_tree_add_item_ret_uint (opt_tree, hf_docsis_optrsp_status, tvb, 4, 1, ENC_BIG_ENDIAN, &status);
7213 
7214   col_add_fstr (pinfo->cinfo, COL_INFO, "OPT-RSP: DS CH ID: %u, Profile ID: %s (%u), Status: %s (%u)", downstream_channel_id,
7215                               val_to_str(profile_identifier, profile_id_vals, "Unknown Profile ID (%u)"), profile_identifier,
7216                               val_to_str(status, opt_status_vals, "Unknown status (%u)"), status);
7217 
7218   version = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_docsis_mgmt, KEY_MGMT_VERSION));
7219   if (version > 4) {
7220     multipart = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_docsis_mgmt, KEY_MGMT_MULTIPART));
7221   } else {
7222     multipart = 0;
7223   }
7224 
7225   /* Reassemble TLVs */
7226   if (tvb_reported_length_remaining(tvb, 5) > 0) {
7227     if (version > 4 && multipart) {
7228       /* Fragmented data */
7229       number_of_fragments = (multipart >> 4);
7230       fragment_sequence_number = (multipart & 0x0F);
7231 
7232       /* DOCSIS MAC management messages do not have network (IP) address. Use link (MAC) address instead. Same workflow as in wimax. */
7233       /* Save address pointers. */
7234       copy_address_shallow(&save_src, &pinfo->src);
7235       copy_address_shallow(&save_dst, &pinfo->dst);
7236       /* Use dl_src and dl_dst in defragmentation. */
7237       copy_address_shallow(&pinfo->src, &pinfo->dl_src);
7238       copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
7239 
7240       fragment_head* fh = fragment_add_seq_check(&docsis_opt_tlv_reassembly_table, tvb, 5, pinfo, downstream_channel_id, NULL,
7241                                                 fragment_sequence_number,
7242                                                 tvb_reported_length_remaining(tvb, 5),
7243                                                 (fragment_sequence_number != number_of_fragments));
7244 
7245       /* Restore address pointers. */
7246       copy_address_shallow(&pinfo->src, &save_src);
7247       copy_address_shallow(&pinfo->dst, &save_dst);
7248 
7249       if (fh) {
7250         tlv_tvb = process_reassembled_data(tvb, 5, pinfo, "Reassembled OPT TLV", fh, &docsis_tlv_frag_items,
7251                                            NULL, opt_tree);
7252 
7253         if (tlv_tvb && tvb_reported_length(tlv_tvb) > 0) {
7254           dissect_optrsp_tlv(tlv_tvb, pinfo, opt_tree);
7255         }
7256       }
7257     } else { /* version > 4 && multipart */
7258       tlv_tvb = tvb_new_subset_remaining (tvb, 5);
7259       dissect_optrsp_tlv(tlv_tvb, pinfo, opt_tree);
7260     }
7261   }
7262 
7263   return tvb_reported_length(tvb);
7264 }
7265 
7266 static int
7267 dissect_optack (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data  _U_)
7268 {
7269   proto_item *it;
7270   proto_tree *opt_tree;
7271 
7272   guint32 downstream_channel_id, profile_identifier;
7273 
7274   it = proto_tree_add_item(tree, proto_docsis_optack, tvb, 0, -1, ENC_NA);
7275   opt_tree = proto_item_add_subtree (it, ett_docsis_optack);
7276   proto_tree_add_item (opt_tree, hf_docsis_optack_reserved, tvb, 0, 2, ENC_BIG_ENDIAN);
7277   proto_tree_add_item_ret_uint (opt_tree, hf_docsis_mgt_down_chid, tvb, 2, 1, ENC_BIG_ENDIAN, &downstream_channel_id);
7278   proto_tree_add_item_ret_uint (opt_tree, hf_docsis_optack_prof_id, tvb, 3, 1, ENC_BIG_ENDIAN, &profile_identifier);
7279 
7280   col_add_fstr (pinfo->cinfo, COL_INFO, "OPT-ACK: DS CH ID: %u, Profile ID: %s (%u)", downstream_channel_id,
7281                               val_to_str(profile_identifier, profile_id_vals, "Unknown Profile ID (%u)"), profile_identifier);
7282 
7283   return tvb_captured_length(tvb);
7284 }
7285 
7286 static int
7287 dissect_rba (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data  _U_)
7288 {
7289   proto_item *it, *rba_direction_it;
7290   proto_tree *rba_tree;
7291 
7292   guint32 tg_id, dcid;
7293   guint32 subband_index, nr_of_subbands;
7294 
7295   static int * const rba_control_byte[] = {
7296     &hf_docsis_rba_resource_block_change_bit,
7297     &hf_docsis_rba_expiration_time_valid_bit,
7298     &hf_docsis_rba_control_byte_bitmask_rsvd,
7299     NULL
7300   };
7301 
7302   it = proto_tree_add_item(tree, proto_docsis_rba, tvb, 0, -1, ENC_NA);
7303   rba_tree = proto_item_add_subtree (it, ett_docsis_rba);
7304   proto_tree_add_item_ret_uint (rba_tree, hf_docsis_rba_tg_id, tvb, 0, 1, ENC_BIG_ENDIAN, &tg_id);
7305   proto_tree_add_item (rba_tree, hf_docsis_rba_ccc, tvb, 1, 1, ENC_BIG_ENDIAN);
7306   proto_tree_add_item_ret_uint (rba_tree, hf_docsis_rba_dcid, tvb, 2, 1, ENC_BIG_ENDIAN, &dcid);
7307   proto_tree_add_bitmask (rba_tree, tvb, 3, hf_docsis_rba_control_byte_bitmask, ett_docsis_rba_control_byte, rba_control_byte, ENC_BIG_ENDIAN);
7308   proto_tree_add_item (rba_tree, hf_docsis_rba_rba_time, tvb, 4, 4, ENC_BIG_ENDIAN);
7309   proto_tree_add_item (rba_tree, hf_docsis_rba_rba_expiration_time, tvb, 8, 4, ENC_BIG_ENDIAN);
7310   proto_tree_add_item_ret_uint (rba_tree, hf_docsis_rba_number_of_subbands, tvb, 12, 1, ENC_BIG_ENDIAN, &nr_of_subbands);
7311   for (subband_index =0; subband_index < nr_of_subbands; ++subband_index) {
7312       rba_direction_it = proto_tree_add_item (rba_tree, hf_docsis_rba_subband_direction, tvb, 13 + subband_index, 1, ENC_BIG_ENDIAN);
7313       proto_item_prepend_text(rba_direction_it, "Sub-band %d: ", subband_index);
7314   }
7315 
7316   col_add_fstr (pinfo->cinfo, COL_INFO, "RBA: TG_ID: %u, DCID: %u", tg_id, dcid);
7317 
7318   return tvb_captured_length(tvb);
7319 }
7320 
7321 static int
7322 dissect_macmgmt (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data _U_)
7323 {
7324   guint32 type, version, dsap, ssap, msg_len;
7325   proto_item *mgt_hdr_it;
7326   proto_tree *mgt_hdr_tree;
7327   tvbuff_t *payload_tvb;
7328   guint8 multipart;
7329 
7330   col_set_str (pinfo->cinfo, COL_PROTOCOL, "DOCSIS MGMT");
7331 
7332   col_clear(pinfo->cinfo, COL_INFO);
7333 
7334   set_address_tvb (&pinfo->dl_src, AT_ETHER, 6, tvb, 6);
7335   copy_address_shallow(&pinfo->src, &pinfo->dl_src);
7336   set_address_tvb (&pinfo->dl_dst, AT_ETHER, 6, tvb, 0);
7337   copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
7338 
7339   static int * const multipart_field[] = {
7340     &hf_docsis_mgt_multipart_number_of_fragments,
7341     &hf_docsis_mgt_multipart_fragment_sequence_number,
7342     NULL
7343   };
7344 
7345   //We need version and type for decoding of ssap and dsap field: in case of RNG-REQ, these fields can contain the Transmit Power Level.
7346   version = tvb_get_guint8 (tvb, 17);
7347   type = tvb_get_guint8 (tvb, 18);
7348   dsap = tvb_get_guint8 (tvb, 14);
7349   ssap = tvb_get_guint8 (tvb, 15);
7350 
7351   mgt_hdr_it = proto_tree_add_item (tree, proto_docsis_mgmt, tvb, 0, 20, ENC_NA);
7352   mgt_hdr_tree = proto_item_add_subtree (mgt_hdr_it, ett_docsis_mgmt);
7353   proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_dst_addr, tvb, 0, 6, ENC_NA);
7354   proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_src_addr, tvb, 6, 6, ENC_NA);
7355   proto_tree_add_item_ret_uint (mgt_hdr_tree, hf_docsis_mgt_msg_len, tvb, 12, 2, ENC_BIG_ENDIAN, &msg_len);
7356 
7357   if ( ((type == MGT_RNG_REQ) || type == MGT_B_INIT_RNG_REQ)
7358        && version == 5
7359        && !(ssap==0 && dsap == 0) ) {
7360     //RNG_REQ or BONDED_INIT_RNG_REQ with upstream transmit power reporting, sent to 3.1 CMTS
7361     proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_31_transmit_power, tvb, 14, 2, ENC_BIG_ENDIAN);
7362   } else if ( ((type == MGT_RNG_REQ && version == 1) || (type == MGT_B_INIT_RNG_REQ && version == 4))
7363        && ssap != 0 ) {
7364     //RNG_REQ or BONDED_INIT_RNG_REQ with upstream transmit power reporting, sent to 3.0 CMTS
7365     proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_dsap, tvb, 14, 1, ENC_BIG_ENDIAN);
7366     proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_30_transmit_power, tvb, 15, 1, ENC_BIG_ENDIAN);
7367   } else {
7368     proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_dsap, tvb, 14, 1, ENC_BIG_ENDIAN);
7369     proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_ssap, tvb, 15, 1, ENC_BIG_ENDIAN);
7370   }
7371 
7372   proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_control, tvb, 16, 1, ENC_BIG_ENDIAN);
7373   proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_version, tvb, 17, 1, ENC_BIG_ENDIAN);
7374   proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_type, tvb, 18, 1, ENC_BIG_ENDIAN);
7375 
7376   p_add_proto_data(pinfo->pool, pinfo, proto_docsis_mgmt, KEY_MGMT_VERSION, GUINT_TO_POINTER(version));
7377 
7378   if (version < 5) {
7379     proto_tree_add_item (mgt_hdr_tree, hf_docsis_mgt_rsvd, tvb, 19, 1, ENC_BIG_ENDIAN);
7380   } else {
7381     proto_tree_add_bitmask(mgt_hdr_tree, tvb, 19, hf_docsis_mgt_multipart, ett_sub_tlv, multipart_field, ENC_BIG_ENDIAN);
7382     multipart = tvb_get_guint8 (tvb, 19);
7383     p_add_proto_data(pinfo->pool, pinfo, proto_docsis_mgmt, KEY_MGMT_MULTIPART, GUINT_TO_POINTER(multipart));
7384   }
7385 
7386   /* Code to Call subdissector */
7387   /* sub-dissectors are based on the type field */
7388   payload_tvb = tvb_new_subset_length (tvb, 20, msg_len - 6);
7389 
7390   /* Special case: map needs version. Two types of MAPs exist, with some difference in encoding: MAPv1 and MAPv5. See also DOCSIS3.1 MULPI spec */
7391   if (type == MGT_MAP) {
7392     if (!dissector_try_uint(docsis_mgmt_dissector_table, 256*version + type, payload_tvb, pinfo, tree)) {
7393       call_data_dissector(payload_tvb, pinfo, tree);
7394     }
7395   } else {
7396     if (!dissector_try_uint(docsis_mgmt_dissector_table, type, payload_tvb, pinfo, tree)) {
7397       call_data_dissector(payload_tvb, pinfo, tree);
7398     }
7399   }
7400 
7401   return tvb_captured_length(tvb);
7402 }
7403 
7404 /* Register the protocol with Wireshark */
7405 void
7406 proto_register_docsis_mgmt (void)
7407 {
7408   static hf_register_info hf[] = {
7409       /* Sync Message */
7410     {&hf_docsis_sync_cmts_timestamp,
7411      {"CMTS Timestamp", "docsis_sync.cmts_timestamp",
7412       FT_UINT32, BASE_DEC, NULL, 0x0,
7413       "Sync CMTS Timestamp", HFILL}
7414     },
7415     /* UCD */
7416     {&hf_docsis_ucd_config_ch_cnt,
7417      {"Config Change Count", "docsis_ucd.confcngcnt",
7418       FT_UINT8, BASE_DEC, NULL, 0x0,
7419       "Configuration Change Count", HFILL}
7420     },
7421     {&hf_docsis_ucd_mini_slot_size,
7422      {"Mini Slot Size (6.25us TimeTicks)", "docsis_ucd.mslotsize",
7423       FT_UINT8, BASE_DEC, NULL, 0x0,
7424       NULL, HFILL}
7425     },
7426     {&hf_docsis_ucd_type,
7427      {"Type", "docsis_ucd.type",
7428       FT_UINT8, BASE_DEC, VALS(channel_tlv_vals), 0x0,
7429       "Channel TLV type", HFILL}
7430     },
7431     {&hf_docsis_ucd_length,
7432      {"Length", "docsis_ucd.length",
7433       FT_UINT8, BASE_DEC, NULL, 0x0,
7434       "Channel TLV length", HFILL}
7435     },
7436     {&hf_docsis_ucd_burst_type,
7437      {"Type", "docsis_ucd.burst.tlvtype",
7438       FT_UINT8, BASE_DEC, VALS(burst_tlv_vals), 0x0,
7439       "Burst TLV type", HFILL}
7440     },
7441     {&hf_docsis_ucd_burst_length,
7442      {"Length", "docsis_ucd.burst.tlvlen",
7443       FT_UINT8, BASE_DEC, NULL, 0x0,
7444       "Burst TLV length", HFILL}
7445     },
7446     {&hf_docsis_ucd_symbol_rate,
7447      {"Symbol Rate (ksym/sec)", "docsis_ucd.symrate",
7448       FT_UINT8, BASE_DEC, NULL, 0x0,
7449       "Symbol Rate", HFILL}
7450     },
7451     {&hf_docsis_ucd_frequency,
7452      {"Frequency (Hz)", "docsis_ucd.freq",
7453       FT_UINT32, BASE_DEC, NULL, 0x0,
7454       "Upstream Center Frequency", HFILL}
7455     },
7456     {&hf_docsis_ucd_preamble_pat,
7457      {"Preamble Pattern", "docsis_ucd.preamble",
7458       FT_BYTES, BASE_NONE, NULL, 0x0,
7459       "Preamble Superstring", HFILL}
7460     },
7461     {&hf_docsis_ucd_ext_preamble_pat,
7462      {"Extended Preamble Pattern", "docsis_ucd.extpreamble",
7463       FT_BYTES, BASE_NONE, NULL, 0x0,
7464       "Extended Preamble Superstring", HFILL}
7465     },
7466     {&hf_docsis_ucd_scdma_mode_enabled,
7467      {"S-CDMA Mode Enabled", "docsis_ucd.scdma",
7468       FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
7469       NULL, HFILL}
7470     },
7471     {&hf_docsis_ucd_scdma_spreading_interval,
7472      {"SCDMA Spreading Interval", "docsis_ucd.scdmaspreadinginterval",
7473       FT_BYTES, BASE_NONE, NULL, 0x0,
7474       NULL, HFILL}
7475     },
7476     {&hf_docsis_ucd_scdma_codes_per_mini_slot,
7477      {"SCDMA Codes per mini slot", "docsis_ucd.scdmacodesperminislot",
7478       FT_BYTES, BASE_NONE, NULL, 0x0,
7479       NULL, HFILL}
7480     },
7481     {&hf_docsis_ucd_scdma_active_codes,
7482      {"SCDMA Active Codes", "docsis_ucd.scdmaactivecodes",
7483       FT_BYTES, BASE_NONE, NULL, 0x0,
7484       NULL, HFILL}
7485     },
7486     {&hf_docsis_ucd_scdma_code_hopping_seed,
7487      {"SCDMA Code Hopping Seed", "docsis_ucd.scdmacodehoppingseed",
7488       FT_BYTES, BASE_NONE, NULL, 0x0,
7489       NULL, HFILL}
7490     },
7491     {&hf_docsis_ucd_scdma_us_ratio_num,
7492      {"SCDMA US Ratio Numerator", "docsis_ucd.scdmausrationum",
7493       FT_BYTES, BASE_NONE, NULL, 0x0,
7494       NULL, HFILL}
7495     },
7496     {&hf_docsis_ucd_scdma_us_ratio_denom,
7497      {"SCDMA US Ratio Denominator", "docsis_ucd.scdmausratiodenom",
7498       FT_BYTES, BASE_NONE, NULL, 0x0,
7499       NULL, HFILL}
7500     },
7501     {&hf_docsis_ucd_scdma_timestamp_snapshot,
7502      {"SCDMA Timestamp Snapshot", "docsis_ucd.scdmatimestamp",
7503       FT_BYTES, BASE_NONE, NULL, 0x0,
7504       NULL, HFILL}
7505     },
7506     {&hf_docsis_ucd_maintain_power_spectral_density,
7507      {"Maintain Power Spectral Density", "docsis_ucd.maintpower",
7508       FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
7509       NULL, HFILL}
7510     },
7511     {&hf_docsis_ucd_ranging_required,
7512      {"Ranging Required", "docsis_ucd.rangingreq",
7513       FT_UINT8, BASE_DEC, VALS (ranging_req_vals), 0x0,
7514       NULL, HFILL}
7515     },
7516     {&hf_docsis_ucd_max_scheduled_codes,
7517      {"S-CDMA Max Scheduled Codes", "docsis_ucd.scdmamaxcodes",
7518       FT_UINT8, BASE_DEC, VALS (max_scheduled_codes_vals), 0x0,
7519       NULL, HFILL}
7520     },
7521     {&hf_docsis_ucd_rnghoff_cm,
7522      {"Ranging Hold-Off (CM)","docsis_ucd.rnghoffcm",
7523       FT_BOOLEAN, 32, TFS(&tfs_allow_inhibit), 0x1,
7524       NULL, HFILL}
7525     },
7526     {&hf_docsis_ucd_rnghoff_erouter,
7527      {"Ranging Hold-Off (eRouter)",
7528       "docsis_ucd.rnghofferouter",
7529       FT_BOOLEAN, 32, TFS(&tfs_allow_inhibit), 0x2,
7530       NULL, HFILL}
7531     },
7532     {&hf_docsis_ucd_rnghoff_emta,
7533      {"Ranging Hold-Off (eMTA or EDVA)",
7534       "docsis_ucd.rnghoffemta",
7535       FT_BOOLEAN, 32, TFS(&tfs_allow_inhibit), 0x4,
7536       NULL, HFILL}
7537     },
7538     {&hf_docsis_ucd_rnghoff_estb,
7539      {"Ranging Hold-Off (DSG/eSTB)",
7540       "docsis_ucd.rnghoffestb",
7541       FT_BOOLEAN, 32, TFS(&tfs_allow_inhibit), 0x8,
7542       NULL, HFILL}
7543     },
7544     {&hf_docsis_ucd_rnghoff_rsvd,
7545      {"Reserved",
7546       "docsis_ucd.rnghoffrsvd",
7547       FT_UINT32, BASE_HEX, NULL, 0xFFF0,
7548       NULL, HFILL}
7549     },
7550     {&hf_docsis_ucd_rnghoff_id_ext,
7551      {"CM Ranging Class ID Extension",
7552       "docsis_ucd.rngidext",
7553       FT_UINT32, BASE_HEX, NULL, 0xFFFF0000,
7554       NULL, HFILL}
7555     },
7556     {&hf_docsis_ucd_chan_class_id_cm,
7557      {"Channel Class ID (CM)","docsis_ucd.classidcm",
7558       FT_UINT32, BASE_DEC, VALS (inhibit_allow_vals), 0x1,
7559       NULL, HFILL}
7560     },
7561     {&hf_docsis_ucd_chan_class_id_erouter,
7562      {"Channel Class ID (eRouter)",
7563       "docsis_ucd.classiderouter",
7564       FT_UINT32, BASE_DEC, VALS (inhibit_allow_vals), 0x2,
7565       NULL, HFILL}
7566     },
7567     {&hf_docsis_ucd_chan_class_id_emta,
7568      {"Channel Class ID (eMTA or EDVA)",
7569       "docsis_ucd.classidemta",
7570       FT_UINT32, BASE_DEC, VALS (inhibit_allow_vals), 0x4,
7571       NULL, HFILL}
7572     },
7573     {&hf_docsis_ucd_chan_class_id_estb,
7574      {"Channel Class ID (DSG/eSTB)",
7575       "docsis_ucd.classidestb",
7576       FT_UINT32, BASE_DEC, VALS (inhibit_allow_vals), 0x8,
7577       NULL, HFILL}
7578     },
7579     {&hf_docsis_ucd_chan_class_id_rsvd,
7580      {"Reserved",
7581       "docsis_ucd.classidrsvd",
7582       FT_UINT32, BASE_HEX, NULL, 0xFFF0,
7583       NULL, HFILL}
7584     },
7585     {&hf_docsis_ucd_chan_class_id_id_ext,
7586      {"CM Ranging Class ID Extension",
7587       "docsis_ucd.classidext",
7588       FT_UINT32, BASE_HEX, NULL, 0xFFFF0000,
7589       NULL, HFILL}
7590     },
7591     {&hf_docsis_ucd_change_ind_bitmask_subc_excl_band,
7592      {"UCD Change Indicator Bitmask: Subcarrier Exclusion Band TLV", "docsis_ucd.burst.ucd_change_ind_bitmask_subc_excl_band",
7593       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x01,
7594       NULL, HFILL}
7595     },
7596     {&hf_docsis_ucd_change_ind_bitmask_unused_subc,
7597      {"UCD Change Indicator Bitmask: Unused Subcarrier Specification TLV", "docsis_ucd.burst.ucd_change_ind_bitmask_unused_subc",
7598       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x02,
7599       NULL, HFILL}
7600     },
7601     {&hf_docsis_ucd_change_ind_bitmask_other_subc,
7602      {"UCD Change Indicator Bitmask: Other than Subcarrier Exclusion Band and Unused Subcarrier Specification TLV", "docsis_ucd.burst.ucd_change_ind_bitmask_other_subc",
7603       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x04,
7604       NULL, HFILL}
7605     },
7606     {&hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc5,
7607      {"UCD Change Indicator Bitmask: Burst Attributes associated with IUC5", "docsis_ucd.burst.ucd_change_ind_bitmask_burst_attr_iuc5",
7608       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x08,
7609       NULL, HFILL}
7610     },
7611     {&hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc6,
7612      {"UCD Change Indicator Bitmask: Burst Attributes associated with IUC6", "docsis_ucd.burst.ucd_change_ind_bitmask_burst_attr_iuc6",
7613       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x10,
7614       NULL, HFILL}
7615     },
7616     {&hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc9,
7617      {"UCD Change Indicator Bitmask: Burst Attributes associated with IUC9", "docsis_ucd.burst.ucd_change_ind_bitmask_burst_attr_iuc9",
7618       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x20,
7619       NULL, HFILL}
7620     },
7621     {&hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc10,
7622      {"UCD Change Indicator Bitmask: Burst Attributes associated with IUC10", "docsis_ucd.burst.ucd_change_ind_bitmask_burst_attr_iuc10",
7623       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x40,
7624       NULL, HFILL}
7625     },
7626     {&hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc11,
7627      {"UCD Change Indicator Bitmask: Burst Attributes associated with IUC11", "docsis_ucd.burst.ucd_change_ind_bitmask_burst_attr_iuc11",
7628       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x80,
7629       NULL, HFILL}
7630     },
7631     {&hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc12,
7632      {"UCD Change Indicator Bitmask: Burst Attributes associated with IUC12", "docsis_ucd.burst.ucd_change_ind_bitmask_burst_attr_iuc12",
7633       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x01,
7634       NULL, HFILL}
7635     },
7636     {&hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc13,
7637      {"UCD Change Indicator Bitmask: Burst Attributes associated with IUC13", "docsis_ucd.burst.ucd_change_ind_bitmask_burst_attr_iuc13",
7638       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x02,
7639       NULL, HFILL}
7640     },
7641     {&hf_docsis_ucd_change_ind_bitmask_burst_attr_iuc3_or_4,
7642      {"UCD Change Indicator Bitmask: Burst Attributes associated with IUC3 or IUC4", "docsis_ucd.burst.ucd_change_ind_bitmask_burst_attr_iuc3_or_4",
7643       FT_BOOLEAN, 8, TFS(&tfs_ucd_change_ind_vals), 0x04,
7644       NULL, HFILL}
7645     },
7646     {&hf_docsis_ucd_change_ind_bitmask_reserved,
7647      {"UCD Change Indicator Bitmask: Reserved", "docsis_ucd.burst.ucd_change_ind_bitmask_reserved",
7648       FT_UINT8, BASE_HEX, NULL, 0xF8,
7649       NULL, HFILL}
7650     },
7651     {&hf_docsis_ucd_ofdma_timestamp_snapshot,
7652      {"OFDMA Timestamp Snapshot", "docsis_ucd.ofdma_timestamp_snapshot",
7653       FT_BYTES, BASE_NONE, NULL, 0x00,
7654       NULL, HFILL}
7655     },
7656     {&hf_docsis_ucd_ofdma_timestamp_snapshot_reserved,
7657      {"OFDMA Timestamp Snapshot - Reserved", "docsis_ucd.ofdma_timestamp_snapshot_reserved",
7658       FT_UINT40, BASE_HEX, NULL, 0xF000000000,
7659       NULL, HFILL}
7660     },
7661     {&hf_docsis_ucd_ofdma_timestamp_snapshot_d30timestamp,
7662      {"OFDMA Timestamp Snapshot - D3.0 timestamp", "docsis_ucd.ofdma_timestamp_snapshot_d30timestamp",
7663       FT_UINT40, BASE_HEX, NULL, 0x0FFFFFFFF0,
7664       NULL, HFILL}
7665     },
7666     {&hf_docsis_ucd_ofdma_timestamp_snapshot_4msbits_of_div20,
7667      {"OFDMA Timestamp Snapshot - 4 Most Significant bits of div20 field", "docsis_ucd.ofdma_timestamp_snapshot_4msbits_of_div20",
7668       FT_UINT40, BASE_HEX, NULL, 0x000000000F,
7669       NULL, HFILL}
7670     },
7671     {&hf_docsis_ucd_ofdma_timestamp_snapshot_minislot_count,
7672      {"OFDMA Timestamp Snapshot - Minislot Count", "docsis_ucd.ofdma_timestamp_snapshot_minislot_count",
7673       FT_UINT32, BASE_HEX, NULL, 0x0,
7674       NULL, HFILL}
7675     },
7676     {&hf_docsis_ucd_ofdma_cyclic_prefix_size,
7677      {"OFDMA Cyclic Prefix Size", "docsis_ucd.ofdma_cyclic_prefix_size",
7678       FT_UINT8, BASE_DEC, VALS(ofdma_cyclic_prefix_size_vals), 0x00,
7679       NULL, HFILL}
7680     },
7681     {&hf_docsis_ucd_ofdma_rolloff_period_size,
7682      {"OFDMA Rolloff Period Size", "docsis_ucd.ofdma_rolloff_period_size",
7683       FT_UINT8, BASE_DEC, VALS(ofdma_rolloff_period_size_vals), 0x00,
7684       NULL, HFILL}
7685     },
7686     {&hf_docsis_ucd_subc_spacing,
7687      {"Subcarrier Spacing", "docsis_ucd.subc_spacing",
7688       FT_UINT8, BASE_DEC, VALS(subc_spacing_vals), 0x00,
7689       NULL, HFILL}
7690     },
7691     {&hf_docsis_ucd_cent_freq_subc0,
7692      {"Center Frequency of Subcarrier 0", "docsis_ucd.cent_freq_subc0",
7693       FT_UINT8, BASE_DEC, NULL, 0x00,
7694       NULL, HFILL}
7695     },
7696     {&hf_docsis_ucd_subcarrier_range,
7697      {"Subcarrier range", "docsis_ucd.subc_range",
7698       FT_UINT32, BASE_CUSTOM, CF_FUNC(subc_assign_range), 0x00,
7699       NULL, HFILL}
7700     },
7701     {&hf_docsis_ucd_symb_ofdma_frame,
7702      {"Symbols in OFDMA frame", "docsis_ucd.symb_ofdma_frame",
7703       FT_UINT8, BASE_DEC, NULL, 0x00,
7704       NULL, HFILL}
7705     },
7706     {&hf_docsis_ucd_rand_seed,
7707      {"Randomization Seed", "docsis_ucd.rand_seed",
7708       FT_BYTES, BASE_NONE, NULL, 0x00,
7709       NULL, HFILL}
7710     },
7711     {&hf_docsis_ucd_iuc,
7712      {"Interval Usage Code", "docsis_ucd.iuc",
7713       FT_UINT8, BASE_DEC, VALS (iuc_vals), 0x0,
7714       NULL, HFILL}
7715     },
7716     {&hf_docsis_burst_mod_type,
7717      {"Modulation Type", "docsis_ucd.burst.modtype",
7718       FT_UINT8, BASE_DEC, VALS (mod_vals), 0x0,
7719       NULL, HFILL}
7720     },
7721     {&hf_docsis_burst_diff_encoding,
7722      {"Differential Encoding", "docsis_ucd.burst.diffenc",
7723       FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
7724       NULL, HFILL}
7725     },
7726     {&hf_docsis_burst_preamble_len,
7727      {"Preamble Length (Bits)", "docsis_ucd.burst.preamble_len",
7728       FT_UINT16, BASE_DEC, NULL, 0x0,
7729       NULL, HFILL}
7730     },
7731     {&hf_docsis_burst_preamble_val_off,
7732      {"Preamble Offset (Bits)", "docsis_ucd.burst.preamble_off",
7733       FT_UINT16, BASE_DEC, NULL, 0x0,
7734       NULL, HFILL}
7735     },
7736     {&hf_docsis_burst_fec,
7737      {"FEC (T)", "docsis_ucd.burst.fec",
7738       FT_UINT8, BASE_DEC, NULL, 0x0,
7739       "FEC (T) Codeword Parity Bits = 2^T", HFILL}
7740     },
7741     {&hf_docsis_burst_fec_codeword,
7742      {"FEC Codeword Info bytes (k)", "docsis_ucd.burst.fec_codeword",
7743       FT_UINT8, BASE_DEC, NULL, 0x0,
7744       NULL, HFILL}
7745     },
7746     {&hf_docsis_burst_scrambler_seed,
7747      {"Scrambler Seed", "docsis_ucd.burst.scrambler_seed",
7748       FT_UINT16, BASE_HEX, NULL, 0x0,
7749       "Burst Descriptor", HFILL}
7750     },
7751     {&hf_docsis_burst_max_burst,
7752      {"Max Burst Size (Minislots)", "docsis_ucd.burst.maxburst",
7753       FT_UINT8, BASE_DEC, NULL, 0x0,
7754       NULL, HFILL}
7755     },
7756     {&hf_docsis_burst_guard_time,
7757      {"Guard Time Size (Symbol Times)", "docsis_ucd.burst.guardtime",
7758       FT_UINT8, BASE_DEC, NULL, 0x0,
7759       "Guard Time Size", HFILL}
7760     },
7761     {&hf_docsis_burst_last_cw_len,
7762      {"Last Codeword Length", "docsis_ucd.burst.last_cw_len",
7763       FT_UINT8, BASE_DEC, VALS (last_cw_len_vals), 0x0,
7764       NULL, HFILL}
7765     },
7766     {&hf_docsis_burst_scrambler_onoff,
7767      {"Scrambler On/Off", "docsis_ucd.burst.scrambleronoff",
7768       FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
7769       NULL, HFILL}
7770     },
7771     {&hf_docsis_rs_int_depth,
7772      {"RS Interleaver Depth", "docsis_ucd.burst.rsintdepth",
7773       FT_UINT8, BASE_DEC, NULL, 0x0,
7774       "R-S Interleaver Depth", HFILL}
7775     },
7776     {&hf_docsis_rs_int_block,
7777      {"RS Interleaver Block Size", "docsis_ucd.burst.rsintblock",
7778       FT_UINT8, BASE_DEC, NULL, 0x0,
7779       "R-S Interleaver Block", HFILL}
7780     },
7781     {&hf_docsis_preamble_type,
7782      {"Preamble Type", "docsis_ucd.burst.preambletype",
7783       FT_UINT8, BASE_DEC, NULL, 0x0,
7784       NULL, HFILL}
7785     },
7786     {&hf_docsis_ucd_scdma_scrambler_onoff,
7787      {"Scrambler On/Off", "docsis_ucd.burst.scdmascrambleronoff",
7788       FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
7789       "SCDMA Scrambler On/Off", HFILL}
7790     },
7791     {&hf_docsis_ucd_scdma_codes_per_subframe,
7792      {"SCDMA Codes per Subframe", "docsis_ucd.burst.scdmacodespersubframe",
7793       FT_UINT8, BASE_DEC, NULL, 0x0,
7794       NULL, HFILL}
7795     },
7796     {&hf_docsis_ucd_scdma_framer_int_step_size,
7797      {"SCDMA Framer Interleaving Step Size", "docsis_ucd.burst.scdmaframerintstepsize",
7798       FT_UINT8, BASE_DEC, NULL, 0x0,
7799       NULL, HFILL}
7800     },
7801     {&hf_docsis_ucd_tcm_enabled,
7802      {"TCM Enabled", "docsis_ucd.burst.tcmenabled",
7803       FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
7804       NULL, HFILL}
7805     },
7806     {&hf_docsis_ucd_active_code_hopping,
7807      {"S-CDMA Selection Mode for Active Codes and Code Hopping", "docsis_ucd.selectcodehop",
7808       FT_UINT8, BASE_DEC, VALS (tlv20_vals), 0x0,
7809       NULL, HFILL}
7810     },
7811     {&hf_docsis_ucd_scdma_selection_active_codes,
7812      {"S-CDMA Selection String for Active Codes", "docsis_ucd.selectcode",
7813       FT_BYTES, BASE_NONE, NULL, 0x0,
7814       NULL, HFILL}
7815     },
7816     {&hf_docsis_ucd_higher_ucd_for_same_ucid,
7817      {"Higher UCD for the same UCID", "docsis_ucd.highucdpresent",
7818       FT_BOOLEAN, 8, TFS(&type35ucd_tfs_present_not_present), 0x1,
7819       NULL, HFILL}
7820     },
7821     {&hf_docsis_ucd_higher_ucd_for_same_ucid_resv,
7822      {"Reserved", "docsis_ucd.highucdresv",
7823       FT_UINT8, BASE_HEX, NULL, 0xFE,
7824       NULL, HFILL}
7825     },
7826     {&hf_docsis_subc_init_rang,
7827      {"Subcarriers (Nir) Initial Ranging", "docsis_ucd.burst.subc_init_rang",
7828       FT_UINT16, BASE_DEC, NULL, 0x0,
7829       NULL, HFILL}
7830     },
7831     {&hf_docsis_subc_fine_rang,
7832      {"Subcarriers (Nfr) Fine Ranging", "docsis_ucd.burst.subc_fine_rang",
7833       FT_UINT16, BASE_DEC, NULL, 0x0,
7834       NULL, HFILL}
7835     },
7836     {&hf_docsis_ofdma_prof_mod_order,
7837      {"OFDMA Profile: modulation", "docsis_ucd.burst.ofma_prof_mod_order",
7838       FT_UINT8, BASE_DEC, VALS(ofdma_prof_mod_order), 0xF0,
7839       NULL, HFILL}
7840     },
7841     {&hf_docsis_ofdma_prof_pilot_pattern,
7842      {"OFDMA Profile: pilot pattern", "docsis_ucd.burst.ofma_prof_pilot_pattern",
7843       FT_UINT8, BASE_DEC, NULL, 0x0F,
7844       NULL, HFILL}
7845     },
7846     {&hf_docsis_ofdma_prof_num_add_minislots,
7847      {"OFDMA Profile: Additional Minislots that have identical bit-loading and pilot pattern index", "docsis_ucd.burst.ofma_prof_add_minislots",
7848       FT_UINT8, BASE_DEC, NULL, 0x00,
7849       NULL, HFILL}
7850     },
7851     {&hf_docsis_ofdma_ir_pow_ctrl_start_pow,
7852      {"OFDMA IR Power Control Starting Power Level", "docsis_ucd.burst.ofma_ir_pow_ctrl_start_pow",
7853       FT_UINT8, BASE_CUSTOM, CF_FUNC(ofdma_ir_pow_ctrl_start_pow), 0x00,
7854       NULL, HFILL}
7855     },
7856     {&hf_docsis_ofdma_ir_pow_ctrl_step_size,
7857      {"OFDMA IR Power Control Step Size", "docsis_ucd.burst.ofma_ir_pow_ctrl_step_size",
7858       FT_UINT8, BASE_CUSTOM, CF_FUNC(ofdma_ir_pow_ctrl_step_size), 0x00,
7859       NULL, HFILL}
7860     },
7861     /* MAP */
7862     {&hf_docsis_map_ucd_count,
7863      {"UCD Count", "docsis_map.ucdcount",
7864       FT_UINT8, BASE_DEC, NULL, 0x0,
7865       "Map UCD Count", HFILL}
7866     },
7867     {&hf_docsis_map_numie,
7868      {"Number of IE's", "docsis_map.numie",
7869       FT_UINT8, BASE_DEC, NULL, 0x0,
7870       "Number of Information Elements", HFILL}
7871     },
7872     {&hf_docsis_map_numie_v5,
7873      {"Number of IE's", "docsis_map.numie",
7874       FT_UINT16, BASE_DEC, NULL, 0xFF80,
7875       "Number of Information Elements", HFILL}
7876     },
7877     {&hf_docsis_map_rsvd_v5,
7878      {"Reserved [0x00]", "docsis_map.rsvd",
7879       FT_UINT8, BASE_HEX, NULL, 0x70,
7880       "Reserved Byte", HFILL}
7881     },
7882     {&hf_docsis_map_cat,
7883      {"CAT", "docsis_map.cat",
7884       FT_UINT8, BASE_HEX, NULL, 0x0F,
7885       NULL, HFILL}
7886     },
7887 
7888     {&hf_docsis_map_alloc_start,
7889      {"Alloc Start Time (minislots)", "docsis_map.allocstart",
7890       FT_UINT32, BASE_DEC, NULL, 0x0,
7891       NULL, HFILL}
7892     },
7893     {&hf_docsis_map_ack_time,
7894      {"ACK Time (minislots)", "docsis_map.acktime",
7895       FT_UINT32, BASE_DEC, NULL, 0x0,
7896       NULL, HFILL}
7897     },
7898     {&hf_docsis_map_rng_start,
7899      {"Ranging Backoff Start", "docsis_map.rng_start",
7900       FT_UINT8, BASE_DEC, NULL, 0x0,
7901       NULL, HFILL}
7902     },
7903     {&hf_docsis_map_rng_end,
7904      {"Ranging Backoff End", "docsis_map.rng_end",
7905       FT_UINT8, BASE_DEC, NULL, 0x0,
7906       NULL, HFILL}
7907     },
7908     {&hf_docsis_map_data_start,
7909      {"Data Backoff Start", "docsis_map.data_start",
7910       FT_UINT8, BASE_DEC, NULL, 0x0,
7911       NULL, HFILL}
7912     },
7913     {&hf_docsis_map_data_end,
7914      {"Data Backoff End", "docsis_map.data_end",
7915       FT_UINT8, BASE_DEC, NULL, 0x0,
7916       NULL, HFILL}
7917     },
7918     {&hf_docsis_map_ie,
7919      {"Information Element", "docsis_map.ie",
7920       FT_UINT32, BASE_HEX, NULL, 0x0,
7921       NULL, HFILL}
7922     },
7923     {&hf_docsis_map_probe_ie,
7924      {"Probe Information Element", "docsis_map.probe_ie",
7925       FT_UINT32, BASE_HEX, NULL, 0x0,
7926       NULL, HFILL}
7927     },
7928     {&hf_docsis_map_rsvd,
7929      {"Reserved", "docsis_map.rsvd",
7930       FT_UINT8, BASE_HEX, NULL, 0x0,
7931       "Reserved Byte", HFILL}
7932     },
7933     {&hf_docsis_map_sid,
7934      {"Service Identifier", "docsis_map.sid",
7935       FT_UINT32, BASE_DEC, NULL, 0xFFFC0000,
7936       NULL, HFILL}
7937     },
7938     {&hf_docsis_map_iuc,
7939      {"Interval Usage Code", "docsis_map.iuc",
7940       FT_UINT32, BASE_DEC, VALS(iuc_vals), 0x0003c000,
7941       NULL, HFILL}
7942     },
7943     {&hf_docsis_map_offset,
7944      {"Offset", "docsis_map.offset",
7945       FT_UINT32, BASE_DEC, NULL, 0x00003fff,
7946       NULL, HFILL}
7947     },
7948     {&hf_docsis_map_mer,
7949      {"MER", "docsis_map.mer",
7950       FT_BOOLEAN, 32, TFS(&mer_vals), 0x00020000,
7951       NULL, HFILL}
7952     },
7953     {&hf_docsis_map_pw,
7954      {"PW (Power)", "docsis_map.pw",
7955       FT_BOOLEAN, 32, TFS(&pw_vals), 0x00010000,
7956       NULL, HFILL}
7957     },
7958     {&hf_docsis_map_eq,
7959      {"EQ (TX Equalization)", "docsis_map.eq",
7960       FT_BOOLEAN, 32, TFS(&eq_vals), 0x00008000,
7961       NULL, HFILL}
7962     },
7963     {&hf_docsis_map_st,
7964      {"St (Stagger)", "docsis_map.st",
7965       FT_BOOLEAN, 32, TFS(&st_vals), 0x00004000,
7966       NULL, HFILL}
7967     },
7968     {&hf_docsis_map_probe_frame,
7969      {"Probe Frame", "docsis_map.probe_frame",
7970       FT_UINT32, BASE_DEC, NULL, 0x00003000,
7971       NULL, HFILL}
7972     },
7973     {&hf_docsis_map_symbol_in_frame,
7974      {"Symbol in Frame", "docsis_map.symbol_in_frame",
7975       FT_UINT32, BASE_DEC, NULL, 0x00000fc0,
7976       NULL, HFILL}
7977     },
7978     {&hf_docsis_map_start_subc,
7979      {"Start Subc", "docsis_map.start_subc",
7980       FT_UINT32, BASE_DEC, NULL, 0x00000038,
7981       NULL, HFILL}
7982     },
7983     {&hf_docsis_map_subc_skip,
7984      {"Subc Skip", "docsis_map.subc_skip",
7985       FT_UINT32, BASE_DEC, NULL, 0x00000007,
7986       NULL, HFILL}
7987     },
7988 
7989     /* RNG-REQ */
7990     {&hf_docsis_rngreq_sid_field_bit15,
7991      {"SID field bit 15", "docsis_rngreq.sid_field_bit15",
7992       FT_BOOLEAN, 8, TFS(&sid_field_bit15_tfs), 0x80,
7993       NULL, HFILL}
7994     },
7995     {&hf_docsis_rngreq_sid_field_bit14,
7996      {"SID field bit 14", "docsis_rngreq.sid_field_bit14",
7997       FT_BOOLEAN, 8, TFS(&sid_field_bit14_tfs), 0x40,
7998       NULL, HFILL}
7999     },
8000     {&hf_docsis_rngreq_sid_field_bit15_14,
8001      {"SID field bit 15 to 14", "docsis_rngreq.sid_field_bit15_14",
8002       FT_UINT8, BASE_HEX, VALS(sid_field_bit15_14_vals), 0xC0,
8003       NULL, HFILL}
8004     },
8005     {&hf_docsis_rngreq_sid,
8006      {"Service Identifier", "docsis_rngreq.sid",
8007       FT_UINT16, BASE_DEC, NULL, 0x3FFF,
8008       NULL, HFILL}
8009     },
8010     {&hf_docsis_rngreq_pend_compl,
8011      {"Pending Till Complete", "docsis_rngreq.pendcomp",
8012       FT_UINT8, BASE_DEC, NULL, 0x0,
8013       "Upstream Channel ID", HFILL}
8014     },
8015     /* RNG-RSP */
8016     {&hf_docsis_rngrsp_type,
8017      {"Type", "docsis_rngrsp.type",
8018       FT_UINT8, BASE_DEC, VALS(rngrsp_tlv_vals), 0x0,
8019       "TLV Type", HFILL}
8020      },
8021     {&hf_docsis_rngrsp_length,
8022      {"Length", "docsis_rngrsp.length",
8023       FT_UINT8, BASE_DEC, NULL, 0x0,
8024       "TLV Length", HFILL}
8025      },
8026     {&hf_docsis_rngrsp_sid,
8027      {"Service Identifier", "docsis_rngrsp.sid",
8028       FT_UINT16, BASE_DEC, NULL, 0x0,
8029       NULL, HFILL}
8030      },
8031     {&hf_docsis_rngrsp_timing_adj,
8032      {"Timing Adjust (6.25us/64)", "docsis_rngrsp.timingadj",
8033       FT_INT32, BASE_DEC, NULL, 0x0,
8034       "Timing Adjust", HFILL}
8035      },
8036     {&hf_docsis_rngrsp_power_adj,
8037      {"Power Level Adjust (0.25dB units)", "docsis_rngrsp.poweradj",
8038       FT_INT8, BASE_DEC, NULL, 0x0,
8039       "Power Level Adjust", HFILL}
8040      },
8041     {&hf_docsis_rngrsp_freq_adj,
8042      {"Offset Freq Adjust (Hz)", "docsis_rngrsp.freqadj",
8043       FT_INT16, BASE_DEC, NULL, 0x0,
8044       "Frequency Adjust", HFILL}
8045      },
8046     {&hf_docsis_rngrsp_xmit_eq_adj,
8047      {"Transmit Equalization Adjust", "docsis_rngrsp.xmit_eq_adj",
8048       FT_BYTES, BASE_NONE, NULL, 0x0,
8049       NULL, HFILL}
8050      },
8051     {&hf_docsis_rngrsp_ranging_status,
8052      {"Ranging Status", "docsis_rngrsp.rng_stat",
8053       FT_UINT8, BASE_DEC, VALS (rng_stat_vals), 0x0,
8054       NULL, HFILL}
8055      },
8056     {&hf_docsis_rngrsp_down_freq_over,
8057      {"Downstream Frequency Override (Hz)", "docsis_rngrsp.freq_over",
8058       FT_UINT32, BASE_DEC, NULL, 0x0,
8059       "Downstream Frequency Override", HFILL}
8060      },
8061     {&hf_docsis_rngrsp_upstream_ch_over,
8062      {"Upstream Channel ID Override", "docsis_rngrsp.chid_override",
8063       FT_UINT8, BASE_DEC, NULL, 0x0,
8064       NULL, HFILL}
8065      },
8066     {&hf_docsis_rngrsp_xmit_eq_set,
8067      {"Transmit Equalization Set", "docsis_rngrsp.xmit_eq_set",
8068       FT_BYTES, BASE_NONE, NULL, 0x0,
8069       NULL, HFILL}
8070      },
8071     {&hf_docsis_rngrsp_rngrsp_t4_timeout_multiplier,
8072      {"Multiplier of the default T4 Timeout (the valid range is 1-10)", "docsis_rngrsp.t4_timeout_multiplier",
8073       FT_UINT8, BASE_DEC, NULL, 0x0,
8074       "T4 Timeout Multiplier", HFILL}
8075      },
8076     {&hf_docsis_rngrsp_dynamic_range_window_upper_edge,
8077      {"Dynamic Range Window Upper Edge (in units of 0.25 db below the max allowable setting)", "docsis_rngrsp.dynamic_range_window_upper_edge",
8078       FT_UINT8, BASE_DEC, NULL, 0x0,
8079       "Dynamic Range Window Upper EDGE", HFILL}
8080      },
8081     {&hf_docsis_rngrsp_tlv_unknown,
8082      {"Unknown TLV", "docsis_rngrsp.tlv.unknown",
8083       FT_BYTES, BASE_NONE, NULL, 0x0,
8084       NULL, HFILL}
8085     },
8086     {&hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_main_tap_location,
8087       {"Main Tap Location", "docsis_rngrsp.tlv.trans_eq_enc_scdma_tdma.main_tap_location",
8088         FT_UINT8, BASE_DEC, NULL, 0x0,
8089         NULL, HFILL}
8090     },
8091     {&hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_number_of_forward_taps_per_symbol,
8092       {"Number of Forward Taps per Symbol", "docsis_rngrsp.tlv.trans_eq_enc_scdma_tdma.nr_of_forward_taps_per_symbol",
8093         FT_UINT8, BASE_DEC, NULL, 0x0,
8094         NULL, HFILL}
8095     },
8096     {&hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_number_of_forward_taps_n,
8097       {"Number of Forward Taps (N)", "docsis_rngrsp.tlv.trans_eq_enc_scdma_tdma.nr_of_forward_taps_n",
8098         FT_UINT8, BASE_DEC, NULL, 0x0,
8099         NULL, HFILL}
8100     },
8101     {&hf_docsis_rngrsp_trans_eq_enc_scdma_tdma_reserved,
8102       {"Reserved", "docsis_rngrsp.tlv.trans_eq_enc_scdma_tdma.reserved",
8103         FT_UINT8, BASE_DEC, NULL, 0x0,
8104         NULL, HFILL}
8105     },
8106     {&hf_docsis_rngrsp_trans_eq_data,
8107      {"Transmit equalization data", "docsis_rngrsp.tlv.trans_eq_data",
8108       FT_BYTES, BASE_NONE, NULL, 0x0,
8109       NULL, HFILL}
8110     },
8111     {&hf_docsis_rngrsp_trans_eq_enc_lowest_subc,
8112      {"Lowest Subcarrier for this TLV", "docsis_rngrsp.tlv.trans_eq_enc_lowest_subc",
8113       FT_UINT24, BASE_DEC, NULL, 0xFFF000,
8114       NULL, HFILL}
8115     },
8116     {&hf_docsis_rngrsp_trans_eq_enc_highest_subc,
8117      {"Highest Subcarrier for this TLV", "docsis_rngrsp.tlv.trans_eq_enc_highest_subc",
8118       FT_UINT24, BASE_DEC, NULL, 0x0FFF,
8119       NULL, HFILL}
8120     },
8121     {&hf_docsis_rngrsp_trans_eq_enc_coef_real,
8122      {"Coefficient (real)", "docsis_rngrsp.tlv.trans_eq_enc_coef_real",
8123       FT_INT16, BASE_CUSTOM, CF_FUNC(two_compl_frac), 0x0,
8124       NULL, HFILL}
8125     },
8126     {&hf_docsis_rngrsp_trans_eq_enc_coef_imag,
8127      {"Coefficient (imag)", "docsis_rngrsp.tlv.trans_eq_enc_coef_imag",
8128       FT_INT16, BASE_CUSTOM, CF_FUNC(two_compl_frac), 0x0,
8129       NULL, HFILL}
8130     },
8131     {&hf_docsis_rngrsp_commanded_power_data,
8132      {"Commanded Power Data", "docsis_rngrsp.tlv.comm_pwr_data",
8133       FT_BYTES, BASE_NONE, NULL, 0x00,
8134       NULL, HFILL}
8135     },
8136     {&hf_docsis_rngrsp_commanded_power_dynamic_range_window,
8137      {"Dynamic Range Window", "docsis_rngrsp.tlv.comm_pwr_dyn_range_window",
8138       FT_INT8, BASE_DEC, NULL, 0x00,
8139       NULL, HFILL}
8140     },
8141     {&hf_docsis_rngrsp_commanded_power_ucid,
8142      {"UCID", "docsis_rngrsp.tlv.comm_pwr_ucid",
8143       FT_INT8, BASE_DEC, NULL, 0x00,
8144       NULL, HFILL}
8145     },
8146     {&hf_docsis_rngrsp_commanded_power_trans_pow_lvl,
8147      {"Transmit Power Level (quarter dBmV)", "docsis_rngrsp.tlv.comm_pwr_trans_pow_lvl",
8148       FT_INT16, BASE_DEC, NULL, 0x00,
8149       NULL, HFILL}
8150     },
8151 
8152      /* REG_REQ */
8153     {&hf_docsis_regreq_sid,
8154      {"Service Identifier", "docsis_regreq.sid",
8155       FT_UINT16, BASE_DEC, NULL, 0x0,
8156       NULL, HFILL}
8157     },
8158      /* REG_RSP */
8159     {&hf_docsis_regrsp_sid,
8160      {"Service Identifier", "docsis_regrsp.sid",
8161       FT_UINT16, BASE_DEC, NULL, 0x0,
8162       NULL, HFILL}
8163     },
8164     {&hf_docsis_regrsp_response,
8165      {"Response Code", "docsis_regrsp.respnse",
8166       FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
8167       NULL, HFILL}
8168     },
8169     /* BPKM */
8170     {&hf_docsis_bpkm_code,
8171      {"BPKM Code", "docsis_bpkm.code",
8172       FT_UINT8, BASE_DEC, VALS (code_field_vals), 0x0,
8173       "BPKM Request Message", HFILL}
8174     },
8175     {&hf_docsis_bpkm_ident,
8176      {"BPKM Identifier", "docsis_bpkm.ident",
8177       FT_UINT8, BASE_DEC, NULL, 0x0,
8178       NULL, HFILL}
8179     },
8180     {&hf_docsis_bpkmattr,
8181      {"BPKM Attributes", "docsis_bpkm.attr",
8182       FT_BYTES, BASE_NONE|BASE_NO_DISPLAY_VALUE, NULL, 0x0,
8183       NULL, HFILL}
8184     },
8185     {&hf_docsis_bpkm_length,
8186      {"BPKM Length", "docsis_bpkm.length",
8187       FT_UINT16, BASE_DEC, NULL, 0x0,
8188       NULL, HFILL}
8189     },
8190     {&hf_docsis_bpkmattr_serial_num,
8191      {"Serial Number", "docsis_bpkm.attr.serialnum",
8192       FT_STRING, BASE_NONE, NULL, 0x0,
8193       NULL, HFILL}
8194     },
8195     {&hf_docsis_bpkmattr_manf_id,
8196      {"Manufacturer ID", "docsis_bpkm.attr.manfid",
8197       FT_BYTES, BASE_NONE, NULL, 0x0,
8198       NULL, HFILL}
8199     },
8200     {&hf_docsis_bpkmattr_mac_addr,
8201      {"MAC Address", "docsis_bpkm.attr.macaddr",
8202       FT_ETHER, BASE_NONE, NULL, 0x0,
8203       NULL, HFILL}
8204     },
8205     {&hf_docsis_bpkmattr_rsa_pub_key,
8206      {"RSA Public Key", "docsis_bpkm.attr.rsa_pub_key",
8207       FT_BYTES, BASE_NONE, NULL, 0x0,
8208       NULL, HFILL}
8209     },
8210     {&hf_docsis_bpkmattr_cm_id,
8211      {"CM Identification", "docsis_bpkm.attr.cmid",
8212       FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0,
8213       NULL, HFILL}
8214     },
8215     {&hf_docsis_bpkmattr_display_str,
8216      {"Display String", "docsis_bpkm.attr.dispstr",
8217       FT_STRING, BASE_NONE, NULL, 0x0,
8218       NULL, HFILL}
8219     },
8220     {&hf_docsis_bpkmattr_auth_key,
8221      {"Auth Key", "docsis_bpkm.attr.auth_key",
8222       FT_BYTES, BASE_NONE, NULL, 0x0,
8223       NULL, HFILL}
8224     },
8225     {&hf_docsis_bpkmattr_tek,
8226      {"Traffic Encryption Key", "docsis_bpkm.attr.tek",
8227       FT_BYTES, BASE_NONE, NULL, 0x0,
8228       NULL, HFILL}
8229     },
8230     {&hf_docsis_bpkmattr_key_life,
8231      {"Key Lifetime(s)", "docsis_bpkm.attr.keylife",
8232       FT_UINT32, BASE_DEC, NULL, 0x0,
8233       NULL, HFILL}
8234     },
8235     {&hf_docsis_bpkmattr_key_seq,
8236      {"Key Sequence Number", "docsis_bpkm.attr.keyseq",
8237       FT_UINT8, BASE_DEC, NULL, 0x0,
8238       NULL, HFILL}
8239     },
8240     {&hf_docsis_bpkmattr_hmac_digest,
8241      {"HMAC Digest", "docsis_bpkm.attr.hmacdigest",
8242       FT_BYTES, BASE_NONE, NULL, 0x0,
8243       NULL, HFILL}
8244     },
8245     {&hf_docsis_bpkmattr_said,
8246      {"SAID", "docsis_bpkm.attr.said",
8247       FT_UINT16, BASE_DEC, NULL, 0x0,
8248       "Security Association ID", HFILL}
8249     },
8250     {&hf_docsis_bpkmattr_tek_params,
8251      {"TEK Parameters", "docsis_bpkm.attr.tekparams",
8252       FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0,
8253       NULL, HFILL}
8254     },
8255     {&hf_docsis_bpkmattr_cbc_iv,
8256      {"CBC IV", "docsis_bpkm.attr.cbciv",
8257       FT_BYTES, BASE_NONE, NULL, 0x0,
8258       "Cypher Block Chaining", HFILL}
8259     },
8260     {&hf_docsis_bpkmattr_error_code,
8261      {"Error Code", "docsis_bpkm.attr.errcode",
8262       FT_UINT8, BASE_DEC, VALS (error_code_vals), 0x0,
8263       NULL, HFILL}
8264     },
8265     {&hf_docsis_bpkmattr_vendor_def,
8266      {"Vendor Defined", "docsis_bpkm.attr.vendordef",
8267       FT_BYTES, BASE_NONE, NULL, 0x0,
8268       NULL, HFILL}
8269     },
8270     {&hf_docsis_bpkmattr_ca_cert,
8271      {"CA Certificate", "docsis_bpkm.attr.cacert",
8272       FT_BYTES, BASE_NONE, NULL, 0x0,
8273       NULL, HFILL}
8274     },
8275     {&hf_docsis_bpkmattr_cm_cert,
8276      {"CM Certificate", "docsis_bpkm.attr.cmcert",
8277       FT_BYTES, BASE_NONE, NULL, 0x0,
8278       NULL, HFILL}
8279     },
8280     {&hf_docsis_bpkmattr_security_cap,
8281      {"Security Capabilities", "docsis_bpkm.attr.seccap",
8282       FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0,
8283       NULL, HFILL}
8284     },
8285     {&hf_docsis_bpkmattr_crypto_suite,
8286      {"Cryptographic Suite", "docsis_bpkm.attr.cryptosuite",
8287       FT_UINT16, BASE_HEX, VALS(crypto_suite_attr_vals), 0x0,
8288       NULL, HFILL}
8289     },
8290     {&hf_docsis_bpkmattr_crypto_suite_list,
8291      {"Cryptographic Suite List", "docsis_bpkm.attr.crypto_suite_lst",
8292       FT_BYTES, BASE_NONE, NULL, 0x0,
8293       NULL, HFILL}
8294     },
8295     {&hf_docsis_bpkmattr_bpi_version,
8296      {"BPI Version", "docsis_bpkm.attr.bpiver",
8297       FT_UINT8, BASE_DEC, VALS (bpi_ver_vals), 0x0,
8298       NULL, HFILL}
8299     },
8300     {&hf_docsis_bpkmattr_sa_descr,
8301      {"SA Descriptor", "docsis_bpkm.attr.sadescr",
8302       FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0,
8303       NULL, HFILL}
8304     },
8305     {&hf_docsis_bpkmattr_sa_type,
8306      {"SA Type", "docsis_bpkm.attr.satype",
8307       FT_UINT8, BASE_DEC, NULL, 0x0,
8308       NULL, HFILL}
8309     },
8310     {&hf_docsis_bpkmattr_sa_query,
8311      {"SA Query", "docsis_bpkm.attr.saquery",
8312       FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0,
8313       NULL, HFILL}
8314     },
8315     {&hf_docsis_bpkmattr_sa_query_type,
8316      {"SA Query Type", "docsis_bpkm.attr.saquery_type",
8317       FT_UINT8, BASE_HEX, NULL, 0x0,
8318       NULL, HFILL}
8319     },
8320     {&hf_docsis_bpkmattr_ip_address,
8321      {"IP Address", "docsis_bpkm.attr.ipaddr",
8322       FT_IPv4, BASE_NONE, NULL, 0x0,
8323       NULL, HFILL}
8324     },
8325     {&hf_docsis_bpkmattr_download_param,
8326      {"Download Parameters", "docsis_bpkm.attr.dnld_params",
8327       FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0,
8328       NULL, HFILL}
8329     },
8330     {&hf_docsis_bpkmattr_type,
8331      {"Type", "docsis_bpkm.attr.type",
8332       FT_UINT8, BASE_DEC, VALS(bpkmattr_tlv_vals), 0x0,
8333       "TLV Type", HFILL}
8334      },
8335     {&hf_docsis_bpkmattr_length,
8336      {"Length", "docsis_bpkm.attr.length",
8337       FT_UINT16, BASE_DEC, NULL, 0x0,
8338       "TLV Length", HFILL}
8339      },
8340     /* REG-ACK */
8341     {&hf_docsis_regack_sid,
8342      {"Service Identifier", "docsis_regack.sid",
8343       FT_UINT16, BASE_DEC, NULL, 0x0,
8344       NULL, HFILL}
8345     },
8346     {&hf_docsis_regack_response,
8347      {"Response Code", "docsis_regack.respnse",
8348       FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
8349       NULL, HFILL}
8350     },
8351     /* DAS-RSP */
8352     {&hf_docsis_dsarsp_response,
8353      {"Confirmation Code", "docsis_dsarsp.confcode",
8354       FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
8355       NULL, HFILL}
8356     },
8357     {&hf_docsis_dsaack_response,
8358      {"Confirmation Code", "docsis_dsaack.confcode",
8359       FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
8360       NULL, HFILL}
8361     },
8362     /* DSC-RSP */
8363     {&hf_docsis_dscrsp_response,
8364      {"Confirmation Code", "docsis_dscrsp.confcode",
8365       FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
8366       NULL, HFILL}
8367     },
8368     {&hf_docsis_dscack_response,
8369      {"Confirmation Code", "docsis_dscack.confcode",
8370       FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
8371       NULL, HFILL}
8372     },
8373     /* DSD-REQ */
8374     {&hf_docsis_dsdreq_rsvd,
8375      {"Reserved", "docsis_dsdreq.rsvd",
8376       FT_UINT16, BASE_HEX, NULL, 0x0,
8377       NULL, HFILL}
8378     },
8379     {&hf_docsis_dsdreq_sfid,
8380      {"Service Flow ID", "docsis_dsdreq.sfid",
8381       FT_UINT32, BASE_DEC, NULL, 0x0,
8382       NULL, HFILL}
8383     },
8384     /* DSD-RSP */
8385     {&hf_docsis_dsdrsp_confcode,
8386      {"Confirmation Code", "docsis_dsdrsp.confcode",
8387       FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
8388       NULL, HFILL}
8389     },
8390     {&hf_docsis_dsdrsp_rsvd,
8391      {"Reserved", "docsis_dsdrsp.rsvd",
8392       FT_UINT8, BASE_DEC, NULL, 0x0,
8393       NULL, HFILL}
8394     },
8395     /* DCC-REQ */
8396     {&hf_docsis_dccreq_type,
8397      {
8398       "Type",
8399       "docsis_dccreq.tlvtype",
8400       FT_UINT8, BASE_DEC, VALS(dcc_tlv_vals), 0x0,
8401       NULL,
8402       HFILL
8403      }
8404     },
8405     {&hf_docsis_dccreq_length,
8406      {
8407       "Length",
8408       "docsis_dccreq.tlvlen",
8409       FT_UINT8, BASE_DEC, NULL, 0x0,
8410       NULL,
8411       HFILL
8412      }
8413     },
8414     {&hf_docsis_dccreq_tran_id ,
8415      {
8416        "Transaction ID",
8417        "docsis_dccreq.tran_id",
8418        FT_UINT16, BASE_DEC, NULL, 0x0,
8419        NULL,
8420        HFILL
8421      }
8422     },
8423     {&hf_docsis_dccreq_up_chan_id ,
8424      {
8425        "Up Channel ID",
8426        "docsis_dccreq.up_chan_id",
8427        FT_UINT8, BASE_DEC, NULL, 0x0,
8428        NULL,
8429        HFILL
8430      }
8431     },
8432     {&hf_docsis_dcc_ds_params_subtype,
8433      {
8434       "Type",
8435       "docsis_dccreq.ds_tlvtype",
8436       FT_UINT8, BASE_DEC, VALS(ds_param_subtlv_vals), 0x0,
8437       NULL,
8438       HFILL
8439      }
8440     },
8441     {&hf_docsis_dcc_ds_params_length,
8442      {
8443       "Length",
8444       "docsis_dccreq.ds_tlvlen",
8445       FT_UINT8, BASE_DEC, NULL, 0x0,
8446       NULL,
8447       HFILL
8448      }
8449     },
8450     {&hf_docsis_dccreq_ds_freq ,
8451      {
8452        "Frequency",
8453        "docsis_dccreq.ds_freq",
8454        FT_UINT32, BASE_DEC, NULL, 0x0,
8455        NULL,
8456        HFILL
8457      }
8458     },
8459     {&hf_docsis_dccreq_ds_mod_type ,
8460      {
8461        "Modulation Type",
8462        "docsis_dccreq.ds_mod_type",
8463        FT_UINT8, BASE_DEC, VALS (ds_mod_type_vals), 0x0,
8464        NULL,
8465        HFILL
8466      }
8467     },
8468     {&hf_docsis_dccreq_ds_sym_rate ,
8469      {
8470        "Symbol Rate",
8471        "docsis_dccreq.ds_sym_rate",
8472        FT_UINT8, BASE_DEC, VALS (ds_sym_rate_vals), 0x0,
8473        NULL,
8474        HFILL
8475      }
8476     },
8477     {&hf_docsis_dccreq_ds_intlv_depth_i ,
8478      {
8479        "Interleaver Depth I Value",
8480        "docsis_dccreq.ds_intlv_depth_i",
8481        FT_UINT8, BASE_DEC, NULL, 0x0,
8482        NULL,
8483        HFILL
8484      }
8485     },
8486     {&hf_docsis_dccreq_ds_intlv_depth_j ,
8487      {
8488        "Interleaver Depth J Value",
8489        "docsis_dccreq.ds_intlv_depth_j",
8490        FT_UINT8, BASE_DEC, NULL, 0x0,
8491        NULL,
8492        HFILL
8493      }
8494     },
8495     {&hf_docsis_dccreq_ds_chan_id ,
8496      {
8497        "Downstream Channel ID",
8498        "docsis_dccreq.ds_chan_id",
8499        FT_UINT8, BASE_DEC, NULL, 0x0,
8500        NULL,
8501        HFILL
8502      }
8503     },
8504     {&hf_docsis_dccreq_ds_sync_sub ,
8505      {
8506        "SYNC Substitution",
8507        "docsis_dccreq.ds_sync_sub",
8508        FT_UINT8, BASE_DEC, NULL, 0x0,
8509        NULL,
8510        HFILL
8511      }
8512     },
8513     {&hf_docsis_dccreq_ds_ofdm_block_freq ,
8514      {
8515        "OFDM Block Frequency",
8516        "docsis_dccreq.ds_ofdm_block_freq",
8517        FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &local_units_hz, 0x0,
8518        NULL,
8519        HFILL
8520      }
8521     },
8522     {&hf_docsis_dccreq_init_tech ,
8523      {
8524        "Initialization Technique",
8525        "docsis_dccreq.init_tech",
8526        FT_UINT8, BASE_DEC, VALS (init_tech_vals), 0x0,
8527        NULL,
8528        HFILL
8529      }
8530     },
8531     {&hf_docsis_dccreq_ucd_sub ,
8532      {
8533        "UCD Substitution",
8534        "docsis_dccreq.ucd_sub",
8535        FT_BYTES, BASE_NONE, NULL, 0x0,
8536        NULL,
8537        HFILL
8538      }
8539     },
8540     {&hf_docsis_dccreq_said_sub_cur ,
8541      {
8542        "SAID Sub - Current Value",
8543        "docsis_dccreq.said_sub_cur",
8544        FT_UINT16, BASE_DEC, NULL, 0x0,
8545        NULL,
8546        HFILL
8547      }
8548     },
8549     {&hf_docsis_dccreq_said_sub_new ,
8550      {
8551        "SAID Sub - New Value",
8552        "docsis_dccreq.said_sub_new",
8553        FT_UINT16, BASE_DEC, NULL, 0x0,
8554        NULL,
8555        HFILL
8556      }
8557     },
8558     {&hf_docsis_dcc_sf_sub_subtype,
8559      {
8560       "Type",
8561       "docsis_dccreq.sf_tlvtype",
8562       FT_UINT8, BASE_DEC, VALS(sf_sub_subtlv_vals), 0x0,
8563       NULL,
8564       HFILL
8565      }
8566     },
8567     {&hf_docsis_dcc_sf_sub_length,
8568      {
8569       "Length",
8570       "docsis_dccreq.sf_tlvlen",
8571       FT_UINT8, BASE_DEC, NULL, 0x0,
8572       NULL,
8573       HFILL
8574      }
8575     },
8576     {&hf_docsis_dccreq_sf_sfid_cur ,
8577      {
8578        "SF Sub - SFID Current Value",
8579        "docsis_dccreq.sf_sfid_cur",
8580        FT_UINT32, BASE_DEC, NULL, 0x0,
8581        NULL,
8582        HFILL
8583      }
8584     },
8585     {&hf_docsis_dccreq_sf_sfid_new ,
8586      {
8587        "SF Sub - SFID New Value",
8588        "docsis_dccreq.sf_sfid_new",
8589        FT_UINT32, BASE_DEC, NULL, 0x0,
8590        NULL,
8591        HFILL
8592      }
8593     },
8594     {&hf_docsis_dccreq_sf_sid_cur ,
8595      {
8596        "SF Sub - SID Current Value",
8597        "docsis_dccreq.sf_sid_cur",
8598        FT_UINT16, BASE_DEC, NULL, 0x0,
8599        NULL,
8600        HFILL
8601      }
8602     },
8603     {&hf_docsis_dccreq_sf_sid_new ,
8604      {
8605        "SF Sub - SID New Value",
8606        "docsis_dccreq.sf_sid_new",
8607        FT_UINT16, BASE_DEC, NULL, 0x0,
8608        NULL,
8609        HFILL
8610      }
8611     },
8612     {&hf_docsis_dccreq_sf_unsol_grant_tref ,
8613      {
8614        "SF Sub - Unsolicited Grant Time Reference",
8615        "docsis_dccreq.sf_unsol_grant_tref",
8616        FT_UINT32, BASE_DEC, NULL, 0x0,
8617        NULL,
8618        HFILL
8619      }
8620     },
8621     {&hf_docsis_dccreq_cmts_mac_addr ,
8622      {
8623        "CMTS MAC Address",
8624        "docsis_dccreq.cmts_mac_addr",
8625        FT_ETHER, BASE_NONE, NULL, 0x0,
8626        NULL,
8627        HFILL
8628      }
8629     },
8630     {&hf_docsis_dccreq_key_seq_num ,
8631      {
8632        "Auth Key Sequence Number",
8633        "docsis_dccreq.key_seq_num",
8634        FT_UINT8, BASE_DEC, NULL, 0x0,
8635        NULL,
8636        HFILL
8637      }
8638     },
8639     {&hf_docsis_dccreq_hmac_digest ,
8640      {
8641        "HMAC-DigestNumber",
8642        "docsis_dccreq.hmac_digest",
8643        FT_BYTES, BASE_NONE, NULL, 0x0,
8644        NULL,
8645        HFILL
8646      }
8647     },
8648     /* DCC-RSP */
8649     {&hf_docsis_dccrsp_conf_code ,
8650      {
8651        "Confirmation Code",
8652        "docsis_dccrsp.conf_code",
8653        FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
8654        NULL,
8655        HFILL
8656      }
8657     },
8658     {&hf_docsis_dccrsp_type,
8659      {
8660       "Type",
8661       "docsis_dccrsp.tlvtype",
8662       FT_UINT8, BASE_DEC, VALS(dccrsp_tlv_vals), 0x0,
8663       NULL,
8664       HFILL
8665      }
8666     },
8667     {&hf_docsis_dccrsp_length,
8668      {
8669       "Length",
8670       "docsis_dccrsp.tlvlen",
8671       FT_UINT8, BASE_DEC, NULL, 0x0,
8672       NULL,
8673       HFILL
8674      }
8675     },
8676     {&hf_docsis_dcc_cm_jump_subtype,
8677      {
8678       "Type",
8679       "docsis_dccrsp.cm_jump_tlvtype",
8680       FT_UINT8, BASE_DEC, VALS(cm_jump_subtlv_vals), 0x0,
8681       NULL,
8682       HFILL
8683      }
8684     },
8685     {&hf_docsis_dcc_cm_jump_length,
8686      {
8687       "Length",
8688       "docsis_dccrsp.cm_jump_tlvlen",
8689       FT_UINT8, BASE_DEC, NULL, 0x0,
8690       NULL,
8691       HFILL
8692      }
8693     },
8694     {&hf_docsis_dccrsp_cm_jump_time_length ,
8695      {
8696        "Length of Jump",
8697        "docsis_dccrsp.cm_jump_time_length",
8698        FT_UINT32, BASE_DEC, NULL, 0x0,
8699        NULL,
8700        HFILL
8701      }
8702     },
8703     {&hf_docsis_dccrsp_cm_jump_time_start ,
8704      {
8705        "Start Time of Jump",
8706        "docsis_dccrsp.cm_jump_time_start",
8707        FT_UINT64, BASE_DEC, NULL, 0x0,
8708        NULL,
8709        HFILL
8710      }
8711     },
8712     {&hf_docsis_dccrsp_key_seq_num ,
8713      {
8714        "Auth Key Sequence Number",
8715        "docsis_dccrsp.key_seq_num",
8716        FT_UINT8, BASE_DEC, NULL, 0x0,
8717        NULL,
8718        HFILL
8719      }
8720     },
8721     {&hf_docsis_dccrsp_hmac_digest ,
8722      {
8723        "HMAC-Digest Number",
8724        "docsis_dccrsp.hmac_digest",
8725        FT_BYTES, BASE_NONE, NULL, 0x0,
8726        NULL,
8727        HFILL
8728      }
8729     },
8730     /* DCC-ACK */
8731     {&hf_docsis_dccack_type,
8732      {
8733       "Type",
8734       "docsis_dccack.tlvtype",
8735       FT_UINT8, BASE_DEC, VALS(dccack_tlv_vals), 0x0,
8736       NULL,
8737       HFILL
8738      }
8739     },
8740     {&hf_docsis_dccack_length,
8741      {
8742       "Length",
8743       "docsis_dccack.tlvlen",
8744       FT_UINT8, BASE_DEC, NULL, 0x0,
8745       NULL,
8746       HFILL
8747      }
8748     },
8749     {&hf_docsis_dccack_key_seq_num ,
8750      {
8751        "Auth Key Sequence Number",
8752        "docsis_dccack.key_seq_num",
8753        FT_UINT8, BASE_DEC, NULL, 0x0,
8754        NULL,
8755        HFILL
8756      }
8757     },
8758     {&hf_docsis_dccack_hmac_digest ,
8759      {
8760        "HMAC-DigestNumber",
8761        "docsis_dccack.hmac_digest",
8762        FT_BYTES, BASE_NONE, NULL, 0x0,
8763        NULL,
8764        HFILL
8765      }
8766     },
8767     /* INIT_RNG_REQ */
8768     {&hf_docsis_intrngreq_sid,
8769      {"Service Identifier", "docsis_intrngreq.sid",
8770       FT_UINT16, BASE_DEC, NULL, 0x3FFF,
8771       NULL, HFILL}
8772     },
8773     /* DCD */
8774     {&hf_docsis_dcd_config_ch_cnt,
8775      {
8776        "Configuration Change Count",
8777        "docsis_dcd.config_ch_cnt",
8778        FT_UINT8, BASE_DEC, NULL, 0x0,
8779        NULL,
8780        HFILL
8781      }
8782     },
8783     {&hf_docsis_dcd_num_of_frag,
8784      {
8785        "Number of Fragments",
8786        "docsis_dcd.num_of_frag",
8787        FT_UINT8, BASE_DEC, NULL, 0x0,
8788        NULL,
8789        HFILL
8790      }
8791     },
8792     {&hf_docsis_dcd_frag_sequence_num,
8793      {
8794        "Fragment Sequence Number",
8795        "docsis_dcd.frag_sequence_num",
8796        FT_UINT8, BASE_DEC, NULL, 0x0,
8797        NULL,
8798        HFILL
8799      }
8800     },
8801     {&hf_docsis_dcd_type,
8802      {
8803       "Type",
8804       "docsis_dcd.tlvtype",
8805       FT_UINT8, BASE_DEC, VALS(dcd_tlv_vals), 0x0,
8806       NULL,
8807       HFILL
8808      }
8809     },
8810     {&hf_docsis_dcd_length,
8811      {
8812       "Length",
8813       "docsis_dcd.tlvlen",
8814       FT_UINT8, BASE_DEC, NULL, 0x0,
8815       NULL,
8816       HFILL
8817      }
8818     },
8819     {&hf_docsis_dcd_down_classifier_subtype,
8820      {
8821       "Type",
8822       "docsis_dcd.down_classifier_tlvtype",
8823       FT_UINT8, BASE_DEC, VALS(dcd_down_classifier_vals), 0x0,
8824       NULL,
8825       HFILL
8826      }
8827     },
8828     {&hf_docsis_dcd_down_classifier_length,
8829      {
8830       "Length",
8831       "docsis_dcd.down_classifier_tlvlen",
8832       FT_UINT8, BASE_DEC, NULL, 0x0,
8833       NULL,
8834       HFILL
8835      }
8836     },
8837     {&hf_docsis_dcd_cfr_id,
8838      {
8839        "Downstream Classifier ID",
8840        "docsis_dcd.cfr_id",
8841        FT_UINT16, BASE_DEC, NULL, 0x0,
8842        NULL,
8843        HFILL
8844      }
8845     },
8846     {&hf_docsis_dcd_cfr_rule_pri,
8847      {
8848        "Downstream Classifier Rule Priority",
8849        "docsis_dcd.cfr_rule_pri",
8850        FT_UINT8, BASE_DEC, NULL, 0x0,
8851        NULL,
8852        HFILL
8853      }
8854     },
8855     {&hf_docsis_dcd_cfr_ip_subtype,
8856      {
8857       "Type",
8858       "docsis_dcd.cfr_ip_tlvtype",
8859       FT_UINT8, BASE_DEC, VALS(dcd_cfr_ip_vals), 0x0,
8860       NULL,
8861       HFILL
8862      }
8863     },
8864     {&hf_docsis_dcd_cfr_ip_length,
8865      {
8866       "Length",
8867       "docsis_dcd.cfr_ip_tlvlen",
8868       FT_UINT8, BASE_DEC, NULL, 0x0,
8869       NULL,
8870       HFILL
8871      }
8872     },
8873     {&hf_docsis_dcd_cfr_ip_source_addr,
8874      {
8875        "Downstream Classifier IP Source Address",
8876        "docsis_dcd.cfr_ip_source_addr",
8877        FT_IPv4, BASE_NONE, NULL, 0x0,
8878        NULL,
8879        HFILL
8880      }
8881     },
8882     {&hf_docsis_dcd_cfr_ip_source_mask,
8883      {
8884        "Downstream Classifier IP Source Mask",
8885        "docsis_dcd.cfr_ip_source_mask",
8886        FT_IPv4, BASE_NETMASK, NULL, 0x0,
8887        NULL,
8888        HFILL
8889      }
8890     },
8891     {&hf_docsis_dcd_cfr_ip_dest_addr,
8892      {
8893        "Downstream Classifier IP Destination Address",
8894        "docsis_dcd.cfr_ip_dest_addr",
8895        FT_IPv4, BASE_NONE, NULL, 0x0,
8896        NULL,
8897        HFILL
8898      }
8899     },
8900     {&hf_docsis_dcd_cfr_ip_dest_mask,
8901      {
8902        "Downstream Classifier IP Destination Mask",
8903        "docsis_dcd.cfr_ip_dest_mask",
8904        FT_IPv4, BASE_NETMASK, NULL, 0x0,
8905        "Downstream Classifier IP Destination Address",
8906        HFILL
8907      }
8908     },
8909     {&hf_docsis_dcd_cfr_tcpudp_srcport_start,
8910      {
8911        "Downstream Classifier IP TCP/UDP Source Port Start",
8912        "docsis_dcd.cfr_ip_tcpudp_srcport_start",
8913        FT_UINT16, BASE_DEC, NULL, 0x0,
8914        NULL,
8915        HFILL
8916      }
8917     },
8918     {&hf_docsis_dcd_cfr_tcpudp_srcport_end,
8919      {
8920        "Downstream Classifier IP TCP/UDP Source Port End",
8921        "docsis_dcd.cfr_ip_tcpudp_srcport_end",
8922        FT_UINT16, BASE_DEC, NULL, 0x0,
8923        NULL,
8924        HFILL
8925      }
8926     },
8927     {&hf_docsis_dcd_cfr_tcpudp_dstport_start,
8928      {
8929        "Downstream Classifier IP TCP/UDP Destination Port Start",
8930        "docsis_dcd.cfr_ip_tcpudp_dstport_start",
8931        FT_UINT16, BASE_DEC, NULL, 0x0,
8932        NULL,
8933        HFILL
8934      }
8935     },
8936     {&hf_docsis_dcd_cfr_tcpudp_dstport_end,
8937      {
8938        "Downstream Classifier IP TCP/UDP Destination Port End",
8939        "docsis_dcd.cfr_ip_tcpudp_dstport_end",
8940        FT_UINT16, BASE_DEC, NULL, 0x0,
8941        NULL,
8942        HFILL
8943      }
8944     },
8945     {&hf_docsis_dcd_rule_id,
8946      {
8947        "DSG Rule ID",
8948        "docsis_dcd.rule_id",
8949        FT_UINT8, BASE_DEC, NULL, 0x0,
8950        NULL,
8951        HFILL
8952      }
8953     },
8954     {&hf_docsis_dcd_rule_pri,
8955      {
8956        "DSG Rule Priority",
8957        "docsis_dcd.rule_pri",
8958        FT_UINT8, BASE_DEC, NULL, 0x0,
8959        NULL,
8960        HFILL
8961      }
8962     },
8963     {&hf_docsis_dcd_rule_ucid_list,
8964      {
8965        "DSG Rule UCID Range",
8966        "docsis_dcd.rule_ucid_list",
8967        FT_BYTES, BASE_NONE, NULL, 0x0,
8968        NULL,
8969        HFILL
8970      }
8971     },
8972     {&hf_docsis_dcd_clid_subtype,
8973      {
8974       "Type",
8975       "docsis_dcd.clid_tlvtype",
8976       FT_UINT8, BASE_DEC, VALS(dcd_clid_vals), 0x0,
8977       NULL,
8978       HFILL
8979      }
8980     },
8981     {&hf_docsis_dcd_clid_length,
8982      {
8983       "Length",
8984       "docsis_dcd.clid_tlvlen",
8985       FT_UINT8, BASE_DEC, NULL, 0x0,
8986       NULL,
8987       HFILL
8988      }
8989     },
8990     {&hf_docsis_dcd_clid_bcast_id,
8991      {
8992        "DSG Rule Client ID Broadcast ID",
8993        "docsis_dcd.clid_bcast_id",
8994        FT_UINT16, BASE_DEC, NULL, 0x0,
8995        NULL,
8996        HFILL
8997      }
8998     },
8999     {&hf_docsis_dcd_clid_known_mac_addr,
9000      {
9001        "DSG Rule Client ID Known MAC Address",
9002        "docsis_dcd.clid_known_mac_addr",
9003        FT_ETHER, BASE_NONE, NULL, 0x0,
9004        NULL,
9005        HFILL
9006      }
9007     },
9008     {&hf_docsis_dcd_clid_ca_sys_id,
9009      {
9010        "DSG Rule Client ID CA System ID",
9011        "docsis_dcd.clid_ca_sys_id",
9012        FT_UINT16, BASE_DEC, NULL, 0x0,
9013        NULL,
9014        HFILL
9015      }
9016     },
9017     {&hf_docsis_dcd_clid_app_id,
9018      {
9019        "DSG Rule Client ID Application ID",
9020        "docsis_dcd.clid_app_id",
9021        FT_UINT16, BASE_DEC, NULL, 0x0,
9022        NULL,
9023        HFILL
9024      }
9025     },
9026     {&hf_docsis_dcd_dsg_rule_subtype,
9027      {
9028       "Type",
9029       "docsis_dcd.rule_tlvtype",
9030       FT_UINT8, BASE_DEC, VALS(dcd_dsg_rule_vals), 0x0,
9031       NULL,
9032       HFILL
9033      }
9034     },
9035     {&hf_docsis_dcd_dsg_rule_length,
9036      {
9037       "Length",
9038       "docsis_dcd.rule_tlvlen",
9039       FT_UINT8, BASE_DEC, NULL, 0x0,
9040       NULL,
9041       HFILL
9042      }
9043     },
9044     {&hf_docsis_dcd_rule_tunl_addr,
9045      {
9046        "DSG Rule Tunnel MAC Address",
9047        "docsis_dcd.rule_tunl_addr",
9048        FT_ETHER, BASE_NONE, NULL, 0x0,
9049        NULL,
9050        HFILL
9051      }
9052     },
9053     {&hf_docsis_dcd_rule_cfr_id,
9054      {
9055        "DSG Rule Classifier ID",
9056        "docsis_dcd.rule_cfr_id",
9057        FT_UINT16, BASE_DEC, NULL, 0x0,
9058        NULL,
9059        HFILL
9060      }
9061     },
9062     {&hf_docsis_dcd_rule_vendor_spec,
9063      {
9064        "DSG Rule Vendor Specific Parameters",
9065        "docsis_dcd.rule_vendor_spec",
9066        FT_BYTES, BASE_NONE, NULL, 0x0,
9067        NULL,
9068        HFILL
9069      }
9070     },
9071     {&hf_docsis_dcd_cfg_subtype,
9072      {
9073       "Type",
9074       "docsis_dcd.cfg_tlvtype",
9075       FT_UINT8, BASE_DEC, VALS(dcd_cfg_vals), 0x0,
9076       NULL,
9077       HFILL
9078      }
9079     },
9080     {&hf_docsis_dcd_cfg_length,
9081      {
9082       "Length",
9083       "docsis_dcd.cfg_tlvlen",
9084       FT_UINT8, BASE_DEC, NULL, 0x0,
9085       NULL,
9086       HFILL
9087      }
9088     },
9089     {&hf_docsis_dcd_cfg_chan,
9090      {
9091        "DSG Configuration Channel",
9092        "docsis_dcd.cfg_chan",
9093        FT_UINT32, BASE_DEC, NULL, 0x0,
9094        NULL,
9095        HFILL
9096      }
9097     },
9098     {&hf_docsis_dcd_cfg_tdsg1,
9099      {
9100        "DSG Initialization Timeout (Tdsg1)",
9101        "docsis_dcd.cfg_tdsg1",
9102        FT_UINT16, BASE_DEC, NULL, 0x0,
9103        NULL,
9104        HFILL
9105      }
9106     },
9107     {&hf_docsis_dcd_cfg_tdsg2,
9108      {
9109        "DSG Operational Timeout (Tdsg2)",
9110        "docsis_dcd.cfg_tdsg2",
9111        FT_UINT16, BASE_DEC, NULL, 0x0,
9112        NULL,
9113        HFILL
9114      }
9115     },
9116     {&hf_docsis_dcd_cfg_tdsg3,
9117      {
9118        "DSG Two-Way Retry Timer (Tdsg3)",
9119        "docsis_dcd.cfg_tdsg3",
9120        FT_UINT16, BASE_DEC, NULL, 0x0,
9121        NULL,
9122        HFILL
9123      }
9124     },
9125     {&hf_docsis_dcd_cfg_tdsg4,
9126      {
9127        "DSG One-Way Retry Timer (Tdsg4)",
9128        "docsis_dcd.cfg_tdsg4",
9129        FT_UINT16, BASE_DEC, NULL, 0x0,
9130        NULL,
9131        HFILL
9132      }
9133     },
9134     {&hf_docsis_dcd_cfg_vendor_spec,
9135      {
9136        "DSG Configuration Vendor Specific Parameters",
9137        "docsis_dcd.cfg_vendor_spec",
9138        FT_BYTES, BASE_NONE, NULL, 0x0,
9139        NULL,
9140        HFILL
9141      }
9142     },
9143     /* MDD */
9144     {&hf_docsis_mdd_ccc,
9145      {"Configuration Change Count", "docsis_mdd.ccc",
9146       FT_UINT8, BASE_DEC, NULL, 0x0,
9147       "MDD Configuration Change Count", HFILL}
9148     },
9149     {&hf_docsis_mdd_number_of_fragments,
9150      {"Number of Fragments", "docsis_mdd.number_of_fragments",
9151       FT_UINT8, BASE_DEC, NULL, 0x0,
9152       "MDD Number of Fragments", HFILL}
9153     },
9154     {&hf_docsis_mdd_fragment_sequence_number,
9155      {"Fragment Sequence Number", "docsis_mdd.fragment_sequence_number",
9156       FT_UINT8, BASE_DEC, NULL, 0x0,
9157       "MDD Fragment Sequence Number", HFILL}
9158     },
9159     {&hf_docsis_mdd_current_channel_dcid,
9160      {"Current Channel DCID", "docsis_mdd.current_channel_dcid",
9161       FT_UINT8, BASE_DEC, NULL, 0x0,
9162       "MDD Current Channel DCID", HFILL}
9163     },
9164     {&hf_docsis_mdd_ds_active_channel_list_subtype,
9165      {"Type", "docsis_mdd.downstream_active_channel_list_tlvtype",
9166       FT_UINT8, BASE_DEC, VALS(mdd_ds_active_channel_list_vals), 0x0,
9167       NULL, HFILL}
9168     },
9169     {&hf_docsis_mdd_ds_active_channel_list_length,
9170      {"Length", "docsis_mdd.downstream_active_channel_list_tlvlen",
9171       FT_UINT8, BASE_DEC, NULL, 0x0,
9172       NULL, HFILL}
9173     },
9174     {&hf_docsis_mdd_downstream_active_channel_list_channel_id,
9175      {"Channel ID", "docsis_mdd.downstream_active_channel_list_channel_id",
9176       FT_UINT8, BASE_DEC, NULL, 0x0,
9177       "MDD Downstream Active Channel List Channel ID", HFILL}
9178     },
9179     {&hf_docsis_mdd_downstream_active_channel_list_frequency,
9180      {"Frequency", "docsis_mdd.downstream_active_channel_list_frequency",
9181       FT_UINT32, BASE_DEC, NULL, 0x0,
9182       "MDD Downstream Active Channel List Frequency", HFILL}
9183     },
9184     {&hf_docsis_mdd_downstream_active_channel_list_annex,
9185      {"Annex", "docsis_mdd.downstream_active_channel_list_annex",
9186       FT_UINT8, BASE_DEC, VALS(J83_annex_vals), 0xF0,
9187       "MDD Downstream Active Channel List Annex", HFILL}
9188     },
9189     {&hf_docsis_mdd_downstream_active_channel_list_modulation_order,
9190      {"Modulation Order", "docsis_mdd.downstream_active_channel_list_modulation_order",
9191       FT_UINT8, BASE_DEC, VALS(modulation_order_vals), 0x0F,
9192       "MDD Downstream Active Channel List Modulation Order", HFILL}
9193     },
9194     {&hf_docsis_mdd_downstream_active_channel_list_primary_capable,
9195      {"Primary Capable", "docsis_mdd.downstream_active_channel_list_primary_capable",
9196       FT_UINT8, BASE_DEC, VALS(primary_capable_vals), 0x0,
9197       "MDD Downstream Active Channel List Primary Capable", HFILL}
9198     },
9199     {&hf_docsis_mdd_cm_status_event_enable_bitmask,
9200      {"CM-STATUS Event Enable Bitmask", "docsis_mdd.cm_status_event_enable_bitmask",
9201       FT_UINT16, BASE_HEX, NULL, 0x0,
9202       NULL, HFILL}
9203     },
9204     {&hf_docsis_mdd_cm_status_event_enable_bitmask_mdd_timeout,
9205      {"MDD Timeout", "docsis_mdd.downstream_active_channel_list_mdd_timeout",
9206       FT_UINT16, BASE_DEC, NULL, 0x0002,
9207       "MDD Downstream Active Channel List MDD Timeout", HFILL}
9208     },
9209     {&hf_docsis_mdd_cm_status_event_enable_bitmask_qam_fec_lock_failure,
9210      {"QAM/FEC Lock Failure", "docsis_mdd.cm_status_event_enable_bitmask_qam_fec_lock_failure",
9211       FT_UINT16, BASE_DEC, NULL, 0x0004,
9212       "MDD Downstream Active Channel List QAM/FEC Lock Failure", HFILL}
9213     },
9214     {&hf_docsis_mdd_cm_status_event_enable_bitmask_mdd_recovery,
9215      {"MDD Recovery", "docsis_mdd.cm_status_event_enable_bitmask_mdd_recovery",
9216       FT_UINT16, BASE_DEC, NULL, 0x0010,
9217       "CM-STATUS event MDD Recovery", HFILL}
9218     },
9219     {&hf_docsis_mdd_cm_status_event_enable_bitmask_qam_fec_lock_recovery,
9220      {"QAM/FEC Lock Recovery", "docsis_mdd.cm_status_event_enable_bitmask_qam_fec_lock_recovery",
9221       FT_UINT16, BASE_DEC, NULL, 0x0020,
9222       "CM-STATUS event QAM/FEC Lock Recovery", HFILL}
9223     },
9224     {&hf_docsis_mdd_downstream_active_channel_list_map_ucd_transport_indicator,
9225      {"MAP and UCD transport indicator", "docsis_mdd.downstream_active_channel_list_map_ucd_transport_indicator",
9226       FT_UINT8, BASE_DEC, VALS(map_ucd_transport_indicator_vals), 0x0,
9227       "MDD Downstream Active Channel List MAP and UCD Transport Indicator", HFILL}
9228     },
9229     {&hf_docsis_mdd_ofdm_plc_parameters,
9230      {"OFDM PLC Parameters", "docsis_mdd.ofdm_plc_parameters",
9231       FT_UINT8, BASE_HEX, NULL, 0x0,
9232       NULL, HFILL}
9233     },
9234     {&hf_docsis_mdd_ofdm_plc_parameters_tukey_raised_cosine_window,
9235      {"Tukey raised cosine window", "docsis_mdd.ofdm_plc_parameters_tukey_raised_cosine_window",
9236       FT_UINT8, BASE_DEC, VALS(tukey_raised_cosine_vals), 0x07,
9237       "OFDM PLC Parameters Tukey raised cosine window", HFILL}
9238     },
9239     {&hf_docsis_mdd_ofdm_plc_parameters_cyclic_prefix,
9240      {"Cyclic prefix", "docsis_mdd.ofdm_plc_parameters_cyclic_prefix",
9241       FT_UINT8, BASE_DEC, VALS(cyclic_prefix_vals), 0x38,
9242       "OFDM PLC parameters Cyclic prefix", HFILL}
9243     },
9244     {&hf_docsis_mdd_ofdm_plc_parameters_sub_carrier_spacing,
9245      {"Sub carrier spacing", "docsis_mdd.ofdm_plc_parameters_sub_carrier_spacing",
9246       FT_UINT8, BASE_DEC, VALS(spacing_vals), 0x40,
9247       "OFDM PLC parameters Sub carrier spacing", HFILL}
9248     },
9249     {&hf_docsis_mdd_up_active_channel_list_subtype,
9250      {"Type", "docsis_mdd.up_active_channel_list_tlvtype",
9251       FT_UINT8, BASE_DEC, VALS(mdd_up_active_channel_list_vals), 0x0,
9252       NULL, HFILL}
9253     },
9254     {&hf_docsis_mdd_up_active_channel_list_length,
9255      {"Length", "docsis_mdd.up_active_channel_list_tlvlen",
9256       FT_UINT8, BASE_DEC, NULL, 0x0,
9257       NULL, HFILL}
9258     },
9259     {&hf_docsis_mdd_cm_status_event_enable_bitmask_t4_timeout,
9260      {"T4 timeout", "docsis_mdd.cm_status_event_enable_bitmask_t4_timeout",
9261       FT_UINT16, BASE_DEC, NULL, 0x0040,
9262       "CM-STATUS event T4 timeout", HFILL}
9263     },
9264     {&hf_docsis_mdd_cm_status_event_enable_bitmask_t3_retries_exceeded,
9265      {"T3 Retries Exceeded", "docsis_mdd.cm_status_event_enable_bitmask_t3_retries_exceeded",
9266       FT_UINT16, BASE_DEC, NULL, 0x0080,
9267       "CM-STATUS event T3 Retries Exceeded", HFILL}
9268     },
9269     {&hf_docsis_mdd_cm_status_event_enable_bitmask_successful_ranging_after_t3_retries_exceeded,
9270      {"Successful Ranging after T3 Retries Exceeded", "docsis_mdd.cm_status_event_enable_bitmask_successful_ranging_after_t3_retries_exceeded",
9271       FT_UINT16, BASE_DEC, NULL, 0x0100,
9272       "CM-STATUS event Successful Ranging after T3 Retries Exceeded", HFILL}
9273     },
9274     {&hf_docsis_mdd_mac_domain_downstream_service_group_channel_id,
9275      {"Channel ID", "docsis_mdd.mac_domain_downstream_service_group_channel_id",
9276       FT_UINT8, BASE_DEC, NULL, 0x0,
9277       "MDD MAC Domain Downstream Service Group Channel ID", HFILL}
9278     },
9279     {&hf_docsis_mdd_ds_service_group_subtype,
9280      {"Type", "docsis_mdd.ds_service_group_type",
9281       FT_UINT8, BASE_DEC, VALS(mdd_ds_service_group_vals), 0x0,
9282       NULL, HFILL}
9283     },
9284     {&hf_docsis_mdd_ds_service_group_length,
9285      {"Length", "docsis_mdd.ds_service_group_length",
9286       FT_UINT8, BASE_DEC, NULL, 0x0,
9287       NULL, HFILL}
9288     },
9289     {&hf_docsis_mdd_mac_domain_downstream_service_group_md_ds_sg_identifier,
9290      {"MD-DS-SG Identifier", "docsis_mdd.mac_domain_downstream_service_group_md_ds_sg_identifier",
9291       FT_UINT8, BASE_DEC, NULL, 0x0,
9292       "MDD MAC Domain Downstream Service Group MD-DS-SG Identifier", HFILL}
9293     },
9294     {&hf_docsis_mdd_type,
9295      {"Type", "docsis_mdd.type",
9296       FT_UINT8, BASE_DEC, VALS(mdd_tlv_vals), 0x0,
9297       NULL, HFILL}
9298     },
9299     {&hf_docsis_mdd_length,
9300      {"Length", "docsis_mdd.length",
9301       FT_UINT8, BASE_DEC, NULL, 0x0,
9302       NULL, HFILL}
9303     },
9304     {&hf_docsis_mdd_downstream_ambiguity_resolution_frequency,
9305      {"Frequency", "docsis_mdd.downstream_ambiguity_resolution_frequency",
9306       FT_UINT32, BASE_DEC, NULL, 0x0,
9307       "MDD Downstream Ambiguity Resolution frequency", HFILL}
9308     },
9309     {&hf_docsis_mdd_channel_profile_reporting_control_subtype,
9310      {"Type", "docsis_mdd.channel_profile_reporting_control_type",
9311       FT_UINT8, BASE_DEC, VALS(mdd_channel_profile_reporting_control_vals), 0x0,
9312       NULL, HFILL}
9313     },
9314     {&hf_docsis_mdd_channel_profile_reporting_control_length,
9315      {"Length", "docsis_mdd.channel_profile_reporting_control_length",
9316       FT_UINT8, BASE_DEC, NULL, 0x0,
9317       NULL, HFILL}
9318     },
9319     {&hf_docsis_mdd_rcp_center_frequency_spacing,
9320      {"RCP Center Frequency Spacing", "docsis_mdd.rcp_center_frequency_spacing",
9321       FT_UINT8, BASE_DEC, VALS(rcp_center_frequency_spacing_vals), 0x0,
9322       "MDD RCP Center Frequency Spacing", HFILL}
9323     },
9324     {&hf_docsis_mdd_verbose_rcp_reporting,
9325      {"Verbose RCP reporting", "docsis_mdd.verbose_rcp_reporting",
9326       FT_UINT8, BASE_DEC, VALS(verbose_rcp_reporting_vals), 0x0,
9327       "MDD Verbose RCP Reporting", HFILL}
9328     },
9329     {&hf_docsis_mdd_fragmented_rcp_transmission,
9330      {"Fragmented RCP transmission", "docsis_mdd.fragmented_rcp_transmission",
9331       FT_UINT8, BASE_DEC, VALS(fragmented_rcp_transmission_vals), 0x0,
9332       "MDD Fragmented RCP transmission", HFILL}
9333     },
9334     {&hf_docsis_mdd_ip_init_param_subtype,
9335      {"Type", "docsis_mdd.ip_init_param_type",
9336       FT_UINT8, BASE_DEC, VALS(mdd_ip_init_param_vals), 0x0,
9337       NULL, HFILL}
9338     },
9339     {&hf_docsis_mdd_ip_init_param_length,
9340      {"Length", "docsis_mdd.ip_init_param_length",
9341       FT_UINT8, BASE_DEC, NULL, 0x0,
9342       NULL, HFILL}
9343     },
9344     {&hf_docsis_mdd_ip_provisioning_mode,
9345      {"IP Provisioning Mode", "docsis_mdd.ip_provisioning_mode",
9346       FT_UINT8, BASE_DEC, VALS(ip_provisioning_mode_vals), 0x0,
9347       "MDD IP Provisioning Mode", HFILL}
9348     },
9349     {&hf_docsis_mdd_pre_registration_dsid,
9350      {"Pre-registration DSID", "docsis_mdd.pre_registration_dsid",
9351       FT_UINT24, BASE_DEC, NULL, 0x0FFFFF,
9352       "MDD Pre-registration DSID", HFILL}
9353     },
9354     {&hf_docsis_mdd_early_authentication_and_encryption,
9355      {"Early Authentication and Encryption", "docsis_mdd.early_authentication_and_encryption",
9356       FT_UINT8, BASE_DEC, VALS(eae_vals), 0x0,
9357       "MDD Early Authentication and Encryption", HFILL}
9358     },
9359     {&hf_docsis_mdd_upstream_active_channel_list_upstream_channel_id,
9360      {"Upstream Channel ID", "docsis_mdd.upstream_active_channel_list_upstream_channel_id",
9361       FT_UINT8, BASE_DEC, NULL, 0x0,
9362       "MDD Upstream Active Channel List - Upstream Channel ID", HFILL}
9363     },
9364     {&hf_docsis_mdd_upstream_active_channel_list_upstream_channel_priority,
9365      {"Upstream Channel Priority", "docsis_mdd.upstream_active_channel_list_upstream_channel_priority",
9366       FT_UINT8, BASE_DEC, NULL, 0x0,
9367       "MDD Upstream Active Channel List - Upstream Channel Priority", HFILL}
9368     },
9369     {&hf_docsis_mdd_upstream_active_channel_list_dschids_maps_ucds,
9370      {"Downstream Channel(s) on which MAPs and UCDs for this Upstream Channel are sent", "docsis_mdd.upstream_active_channel_list_dschids_maps_ucds",
9371       FT_BYTES, BASE_NONE, NULL, 0x0,
9372       "MDD Upstream Active Channel List - Downstream Channel(s) on which MAPs and UCDs for this Upstream Channel are sent", HFILL}
9373     },
9374     {&hf_docsis_mdd_upstream_active_channel_list_dschids_maps_ucds_dschid,
9375      {"Downstream Channel ID", "docsis_mdd.upstream_active_channel_list_dschids_maps_ucds.dschid",
9376       FT_UINT8, BASE_DEC, NULL, 0x0,
9377       "MDD Upstream Active Channel List - ID of Downstream Channel on which MAPs and UCDs for this Upstream Channel are sent", HFILL}
9378     },
9379     {&hf_docsis_mdd_upstream_active_channel_list_fdx_upstream_channel,
9380      {"FDX Upstream Channel", "docsis_mdd.upstream_active_channel_list_fdx_upstream_channel",
9381       FT_UINT8, BASE_DEC, NULL, 0x0,
9382       "MDD Upstream Active Channel List - FDX Upstream Channel", HFILL}
9383     },
9384     {&hf_docsis_mdd_upstream_active_channel_list_fdx_subband_id,
9385      {"FDX Sub-band ID", "docsis_mdd.upstream_active_channel_list_fdx_subband_id",
9386       FT_UINT8, BASE_DEC, NULL, 0x0,
9387       "MDD Upstream Active Channel List - FDX Sub-band ID", HFILL}
9388     },
9389     {&hf_docsis_mdd_upstream_ambiguity_resolution_channel_list_channel_id,
9390      {"Channel ID", "docsis_mdd.upstream_ambiguity_resolution_channel_list_channel_id",
9391       FT_UINT8, BASE_DEC, NULL, 0x0,
9392       "MDD MAC Domain Upstream Ambiguity Resolution Channel List Channel ID", HFILL}
9393     },
9394     {&hf_docsis_mdd_upstream_frequency_range,
9395      {"Upstream Frequency Range", "docsis_mdd.upstream_frequency_range",
9396       FT_UINT8, BASE_DEC, VALS(upstream_frequency_range_vals), 0x0,
9397       "MDD Upstream Frequency Range", HFILL}
9398     },
9399     {&hf_docsis_mdd_symbol_clock_locking_indicator,
9400      {"Symbol Clock Locking Indicator", "docsis_mdd.symbol_clock_locking_indicator",
9401       FT_UINT8, BASE_DEC, VALS(symbol_clock_locking_indicator_vals), 0x0,
9402       "MDD Symbol Clock Locking Indicator", HFILL}
9403     },
9404     {&hf_docsis_mdd_cm_status_event_control_subtype,
9405      {"Type", "docsis_mdd.cm_status_event_control_type",
9406       FT_UINT8, BASE_DEC, VALS(mdd_cm_status_event_control_vals), 0x0,
9407       NULL, HFILL}
9408     },
9409     {&hf_docsis_mdd_cm_status_event_control_length,
9410      {"Length", "docsis_mdd.cm_status_event_control_length",
9411       FT_UINT8, BASE_DEC, NULL, 0x0,
9412       NULL, HFILL}
9413     },
9414     {&hf_docsis_mdd_event_type,
9415      {"Event Type", "docsis_mdd.event_type",
9416       FT_UINT8, BASE_DEC, VALS(symbol_cm_status_event_vals), 0x0,
9417       "MDD CM-STATUS Event Type", HFILL}
9418     },
9419     {&hf_docsis_mdd_maximum_event_holdoff_timer,
9420      {"Maximum Event Holdoff Timer (units of 20 ms)", "docsis_mdd.maximum_event_holdoff_timer",
9421       FT_UINT16, BASE_DEC, NULL, 0x0,
9422       "MDD Maximum Event Holdoff Timer", HFILL}
9423     },
9424     {&hf_docsis_mdd_maximum_number_of_reports_per_event,
9425      {"Maximum Number of Reports per Event", "docsis_mdd.maximum_number_of_reports_per_event",
9426       FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_unlimited), 0x0,
9427       "MDD Maximum Number of Reports per Event", HFILL}
9428     },
9429     {&hf_docsis_mdd_upstream_transmit_power_reporting,
9430      {"Upstream Transmit Power Reporting", "docsis_mdd.upstream_transmit_power_reporting",
9431       FT_UINT8, BASE_DEC, VALS(upstream_transmit_power_reporting_vals), 0x0,
9432       "MDD Upstream Transmit Power Reporting", HFILL}
9433     },
9434     {&hf_docsis_mdd_dsg_da_to_dsid_subtype,
9435      {"Type", "docsis_mdd.dsg_da_to_dsid_type",
9436       FT_UINT8, BASE_DEC, VALS(mdd_cm_dsg_da_to_dsid_vals), 0x0,
9437       NULL, HFILL}
9438     },
9439     {&hf_docsis_mdd_dsg_da_to_dsid_length,
9440      {"Length", "docsis_mdd.dsg_da_to_dsid_length",
9441       FT_UINT8, BASE_DEC, NULL, 0x0,
9442       NULL, HFILL}
9443     },
9444     {&hf_docsis_mdd_dsg_da_to_dsid_association_da,
9445      {"Destination Address", "docsis_mdd.dsg_da_to_dsid_association_da",
9446       FT_ETHER, BASE_NONE, NULL, 0x0,
9447       "MDD DSG DA to DSID association Destination Address", HFILL}
9448     },
9449     {&hf_docsis_mdd_dsg_da_to_dsid_association_dsid,
9450      {"DSID", "docsis_mdd.dsg_da_to_dsid_association_dsid",
9451       FT_UINT24, BASE_DEC, NULL, 0x0FFFFF,
9452       "MDD MDD DSG DA to DSID association DSID", HFILL}
9453     },
9454     {&hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events,
9455      {"CM-STATUS Event Enable Bitmask for Non-Channel-Specific Events", "docsis_mdd.cm_status_event_enable_non_channel_specific_events",
9456       FT_UINT16, BASE_HEX, NULL, 0x0,
9457       NULL, HFILL}
9458     },
9459     {&hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_sequence_out_of_range,
9460      {"Sequence out of range", "docsis_mdd.cm_status_event_enable_non_channel_specific_events_sequence_out_of_range",
9461       FT_UINT16, BASE_DEC, NULL, 0x0008,
9462       "CM-STATUS event non-channel-event Sequence out of range", HFILL}
9463     },
9464     {&hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_operating_on_battery_backup,
9465      {"CM operating on battery backup", "docsis_mdd.cm_status_event_enable_non_channel_specific_events_cm_operating_on_battery_backup",
9466       FT_UINT16, BASE_DEC, NULL, 0x0200,
9467       "CM-STATUS event non-channel-event Cm operating on battery backup", HFILL}
9468     },
9469     {&hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_returned_to_ac_power,
9470      {"Returned to AC power", "docsis_mdd.cm_status_event_enable_non_channel_specific_events_cm_returned_to_ac_power",
9471       FT_UINT16, BASE_DEC, NULL, 0x0400,
9472       "CM-STATUS event non-channel-event Cm returned to AC power", HFILL}
9473     },
9474     {&hf_docsis_mdd_extended_upstream_transmit_power_support,
9475      { "Extended Upstream Transmit Power Support", "docsis_mdd.extended_upstream_transmit_power_support",
9476        FT_BOOLEAN, BASE_NONE, TFS(&tfs_on_off), 0x0,
9477        "MDD Extended Upstream Transmit Power Support", HFILL}
9478     },
9479     {&hf_docsis_mdd_cmts_major_docsis_version,
9480      { "CMTS Major DOCSIS Version", "docsis_mdd.cmts_major_docsis_version",
9481        FT_UINT8, BASE_DEC, NULL, 0x0,
9482        NULL, HFILL}
9483     },
9484     {&hf_docsis_mdd_cmts_minor_docsis_version,
9485      { "CMTS Minor DOCSIS Version", "docsis_mdd.cmts_minor_docsis_version",
9486        FT_UINT8, BASE_DEC, NULL, 0x0,
9487        NULL, HFILL}
9488     },
9489     {&hf_docsis_mdd_cm_periodic_maintenance_timeout_indicator,
9490      { "CM periodic maintenance timeout indicator", "docsis_mdd.cm_periodic_maintenance_timeout_indicator",
9491        FT_UINT8, BASE_DEC, VALS(cm_periodic_maintenance_timeout_indicator_vals), 0x0,
9492        NULL, HFILL}
9493     },
9494     {&hf_docsis_mdd_dls_broadcast_and_multicast_delivery_method,
9495      { "DLS Broadcast and Multicast Delivery Method", "docsis_mdd.dls_broadcast_and_multicast_delivery_method",
9496        FT_UINT8, BASE_DEC, VALS(dls_broadcast_and_multicast_delivery_method_vals), 0x0,
9497        NULL, HFILL}
9498     },
9499     {&hf_docsis_mdd_cm_status_event_d31_ofdm_prof_fail,
9500      { "Downstream OFDM Profile Failure", "docsis_mdd.cm_status_event_d31_ofdm_prof_fail",
9501        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x01,
9502        NULL, HFILL}
9503     },
9504     {&hf_docsis_mdd_cm_status_event_d31_prim_down_chan_change,
9505      { "Primary Downstream Channel Change", "docsis_mdd.cm_status_event_d31_prim_down_chan_change",
9506        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x02,
9507        NULL, HFILL}
9508     },
9509     {&hf_docsis_mdd_cm_status_event_d31_dpd_mismatch,
9510      { "DPD Mismatch", "docsis_mdd.cm_status_event_d31_dpd_mismatch",
9511        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x04,
9512        NULL, HFILL}
9513     },
9514     {&hf_docsis_mdd_cm_status_event_d31_deprecated,
9515      { "Deprecated", "docsis_mdd.cm_status_event_d31_deprecated",
9516        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x08,
9517        NULL, HFILL}
9518     },
9519     {&hf_docsis_mdd_cm_status_event_d31_ncp_prof_fail,
9520      { "NCP Profile Failure", "docsis_mdd.cm_status_event_d31_ncp_prof_fail",
9521        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x10,
9522        NULL, HFILL}
9523     },
9524     {&hf_docsis_mdd_cm_status_event_d31_loss_fec_plc,
9525      { "Loss of FEC lock on PLC", "docsis_mdd.cm_status_event_d31_loss_fec_plc",
9526        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x20,
9527        NULL, HFILL}
9528     },
9529     {&hf_docsis_mdd_cm_status_event_d31_ncp_prof_recover,
9530      { "NCP Profile Recovery", "docsis_mdd.cm_status_event_d31_ncp_prof_recover",
9531        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x40,
9532        NULL, HFILL}
9533     },
9534     {&hf_docsis_mdd_cm_status_event_d31_fec_recover_on_plc,
9535      { "FEC Recovery on PLC", "docsis_mdd.cm_status_event_d31_fec_recover_on_plc",
9536        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x80,
9537        NULL, HFILL}
9538     },
9539     {&hf_docsis_mdd_cm_status_event_d31_fec_recover_on_ofdm_prof,
9540      { "FEC Recovery on OFDM Profile", "docsis_mdd.cm_status_event_d31_fec_recover_on_ofdm_prof",
9541        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x0100,
9542        NULL, HFILL}
9543     },
9544     {&hf_docsis_mdd_cm_status_event_d31_ofdma_prof_fail,
9545      { "OFDMA Profile Failure", "docsis_mdd.cm_status_event_d31_ofdma_prof_fail",
9546        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x0200,
9547        NULL, HFILL}
9548     },
9549     {&hf_docsis_mdd_cm_status_event_d31_map_stor_overflow_ind,
9550      { "MAP Storage Overflow Indicator", "docsis_mdd.cm_status_event_d31_map_stor_overflow_ind",
9551        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x0400,
9552        NULL, HFILL}
9553     },
9554     {&hf_docsis_mdd_cm_status_event_d31_ofdm_map_stor_almost_full_ind,
9555      { "MAP Storage Almost Full Indicator", "docsis_mdd.cm_status_event_d31_ofdm_map_stor_almost_full_ind",
9556        FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x0800,
9557        NULL, HFILL}
9558     },
9559     {&hf_docsis_mdd_cm_status_event_d31_reserved,
9560      { "Reserved for future use", "docsis_mdd.cm_status_event_d31_reserved",
9561        FT_UINT32, BASE_HEX, NULL, 0xFFFFF000,
9562        NULL, HFILL}
9563     },
9564     {&hf_docsis_mdd_diplexer_band_edge,
9565      { "Diplexer Band Edge", "docsis_mdd.diplexer_band_edge",
9566        FT_UINT8, BASE_DEC, VALS(mdd_diplexer_band_edge_vals), 0x0,
9567        NULL, HFILL}
9568     },
9569     {&hf_docsis_mdd_diplexer_band_edge_length,
9570      {"Length", "docsis_mdd.diplexer_band_edge_length",
9571       FT_UINT8, BASE_DEC, NULL, 0x0,
9572       NULL, HFILL}
9573     },
9574     {&hf_docsis_mdd_diplexer_us_upper_band_edge,
9575      {"Diplexer Upstream Upper Band Edge", "docsis_mdd.diplexer_us_upper_band_edge",
9576       FT_UINT8, BASE_DEC, VALS(mdd_diplexer_us_upper_band_edge_vals), 0x0,
9577       NULL, HFILL}
9578     },
9579     {&hf_docsis_mdd_diplexer_ds_lower_band_edge,
9580      {"Diplexer Downstream Lower Band Edge", "docsis_mdd.diplexer_ds_lower_band_edge",
9581       FT_UINT8, BASE_DEC, VALS(mdd_diplexer_ds_lower_band_edge_vals), 0x0,
9582       NULL, HFILL}
9583     },
9584     {&hf_docsis_mdd_diplexer_ds_upper_band_edge,
9585      {"Diplexer Downstream Upper Band Edge", "docsis_mdd.diplexer_ds_upper_band_edge",
9586       FT_UINT8, BASE_DEC, VALS(mdd_diplexer_ds_upper_band_edge_vals), 0x0,
9587       NULL, HFILL}
9588     },
9589     {&hf_docsis_mdd_full_duplex_descriptor,
9590      {"Full Duplex Descriptor", "docsis_mdd.full_duplex_descriptor",
9591       FT_UINT8, BASE_DEC, VALS(mdd_full_duplex_descriptor_vals), 0x0,
9592       NULL, HFILL}
9593     },
9594     {&hf_docsis_mdd_full_duplex_descriptor_length,
9595      {"Length", "docsis_mdd.full_duplex_descriptor_length",
9596       FT_UINT8, BASE_DEC, NULL, 0x0,
9597       NULL, HFILL}
9598     },
9599     {&hf_docsis_mdd_full_duplex_allocated_spectrum,
9600      {"Full Duplex Allocated Spectrum", "docsis_mdd.full_duplex_full_allocated_spectrum",
9601       FT_UINT8, BASE_DEC, VALS(mdd_full_duplex_allocated_spectrum_vals), 0x0,
9602       NULL, HFILL}
9603     },
9604     {&hf_docsis_mdd_full_duplex_total_number_of_sub_bands,
9605      {"Total number of sub-bands", "docsis_mdd.full_duplex_total_number_of_sub_bands",
9606       FT_UINT8, BASE_DEC, NULL, 0x0,
9607       NULL, HFILL}
9608     },
9609     {&hf_docsis_mdd_full_duplex_sub_band_width,
9610      {"Full Duplex Sub-band Width", "docsis_mdd.full_duplex_sub_band_width",
9611       FT_UINT8, BASE_DEC, VALS(mdd_full_duplex_sub_band_width_vals), 0x0,
9612       NULL, HFILL}
9613     },
9614     {&hf_docsis_mdd_full_duplex_sub_band_descriptor,
9615      {"Full Duplex Sub-band Descriptor", "docsis_mdd.full_duplex_sub_band_descriptor",
9616       FT_UINT8, BASE_DEC, VALS(mdd_full_duplex_sub_band_vals), 0x0,
9617       NULL, HFILL}
9618     },
9619     {&hf_docsis_mdd_full_duplex_sub_band_descriptor_length,
9620      {"Length", "docsis_mdd.full_duplex_sub_band_descriptor_length",
9621       FT_UINT8, BASE_DEC, NULL, 0x0,
9622       NULL, HFILL}
9623     },
9624     {&hf_docsis_mdd_full_duplex_sub_band_id,
9625      {"Full Duplex Sub-band ID", "docsis_mdd.full_duplex_sub_band_id",
9626       FT_UINT8, BASE_DEC, NULL, 0x0,
9627       NULL, HFILL}
9628     },
9629     {&hf_docsis_mdd_full_duplex_sub_band_offset,
9630      {"Full Duplex Sub-band Offset", "docsis_mdd.full_duplex_sub_band_offset",
9631       FT_UINT16, BASE_DEC, NULL, 0x0,
9632       NULL, HFILL}
9633     },
9634 
9635     /* B_INIT_RNG_REQ */
9636     {&hf_docsis_bintrngreq_capflags,
9637      {"Capability Flags", "docsis_bintrngreq.capflags",
9638       FT_UINT8, BASE_HEX, NULL, 0x0,
9639       NULL, HFILL}
9640     },
9641     {&hf_docsis_bintrngreq_capflags_frag,
9642      {"Pre-3.0 Fragmentation", "docsis_bintrngreq.capflags.frag",
9643       FT_BOOLEAN, 8, NULL, (1<<7),
9644       "Pre-3.0 DOCSIS fragmentation is supported prior to registration", HFILL }
9645     },
9646     {&hf_docsis_bintrngreq_capflags_encrypt,
9647      {"Early Auth. & Encrypt", "docsis_bintrngreq.capflags.encrypt",
9648       FT_BOOLEAN, 8, NULL, (1<<6),
9649       "Early Authentication and Encryption supported", HFILL }
9650     },
9651     {&hf_docsis_bintrngreq_mddsgid,
9652      {"MD-DS-SG-ID", "docsis_bintrngreq.mddsgid",
9653       FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
9654       "MAC Domain Downstream Service Group Identifier", HFILL}
9655     },
9656     /* DBC_REQ */
9657     {&hf_docsis_dbcreq_number_of_fragments,
9658      {"Number of Fragments", "docsis_dbcreq.number_of_fragments",
9659       FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
9660       NULL, HFILL}
9661     },
9662     {&hf_docsis_dbcreq_fragment_sequence_number,
9663      {"Fragment Seq No", "docsis_dbcreq.fragment_sequence_number",
9664       FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
9665       NULL, HFILL}
9666     },
9667     /* DBC_RSP */
9668     {&hf_docsis_dbcrsp_conf_code,
9669      {"Confirmation Code", "docsis_dbcrsp.conf_code",
9670       FT_UINT8, BASE_DEC|BASE_EXT_STRING, &docsis_conf_code_ext, 0x0,
9671       NULL, HFILL}
9672     },
9673     /* DPV_REQ/RSP */
9674     {&hf_docsis_dpv_flags,
9675      {"Flags", "docsis_dpv.flags",
9676       FT_UINT8, BASE_DEC, NULL, 0x0,
9677       NULL, HFILL}
9678     },
9679     {&hf_docsis_dpv_us_sf,
9680      {"Upstream Service Flow ID", "docsis_dpv.us_sf",
9681       FT_UINT32, BASE_DEC, NULL, 0x0,
9682       NULL, HFILL}
9683     },
9684     {&hf_docsis_dpv_n,
9685      {"N (Measurement avaraging factor)", "docsis_dpv.n",
9686       FT_UINT16, BASE_DEC, NULL, 0x0,
9687       NULL, HFILL}
9688     },
9689     {&hf_docsis_dpv_start,
9690      {"Start Reference Point", "docsis_dpv.start",
9691       FT_UINT8, BASE_DEC, NULL, 0x0,
9692       NULL, HFILL}
9693     },
9694     {&hf_docsis_dpv_end,
9695      {"End Reference Point", "docsis_dpv.end",
9696       FT_UINT8, BASE_DEC, NULL, 0x0,
9697       NULL, HFILL}
9698     },
9699     {&hf_docsis_dpv_ts_start,
9700      {"Timestamp Start", "docsis_dpv.ts_start",
9701       FT_UINT32, BASE_DEC, NULL, 0x0,
9702       NULL, HFILL}
9703     },
9704     {&hf_docsis_dpv_ts_end,
9705      {"Timestamp End", "docsis_dpv.ts_end",
9706       FT_UINT32, BASE_DEC, NULL, 0x0,
9707       NULL, HFILL}
9708     },
9709     /* CM Status */
9710     {&hf_docsis_cmstatus_e_t_mdd_t,
9711      {"Event Type: Secondary Channel MDD timeout", "docsis_cmstatus.mdd_timeout", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9712     },
9713     {&hf_docsis_cmstatus_e_t_qfl_f,
9714      {"Event Type: QAM/FEC lock failure", "docsis_cmstatus.qam_fec_lock_failure", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9715     },
9716     {&hf_docsis_cmstatus_e_t_s_o,
9717      {"Event Type: Sequence out-of-range", "docsis_cmstatus.sequence_out_of_range", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9718     },
9719     {&hf_docsis_cmstatus_e_t_mdd_r,
9720      {"Event Type: Secondary Channel MDD Recovery", "docsis_cmstatus.mdd_recovery", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9721     },
9722     {&hf_docsis_cmstatus_e_t_qfl_r,
9723      {"Event Type: QAM/FEC Lock Recovery", "docsis_cmstatus.qam_fec_lock_recovery", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9724     },
9725     {&hf_docsis_cmstatus_e_t_t4_t,
9726      {"Event Type: T4 timeout", "docsis_cmstatus.t4_timeout", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9727     },
9728     {&hf_docsis_cmstatus_e_t_t3_e,
9729      {"Event Type: T3 retries exceeded", "docsis_cmstatus.t3_retries_exceeded", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9730     },
9731     {&hf_docsis_cmstatus_e_t_rng_s,
9732      {"Event Type: Successful ranging after T3 retries exceeded", "docsis_cmstatus.successful_ranging_after_t3_retries_exceeded", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9733     },
9734     {&hf_docsis_cmstatus_e_t_cm_b,
9735      {"Event Type: CM operating on battery backup", "docsis_cmstatus.cm_on_battery", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9736     },
9737     {&hf_docsis_cmstatus_e_t_cm_a,
9738      {"Event Type: CM returned to A/C power", "docsis_cmstatus.cm_on_ac_power", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9739     },
9740     {&hf_docsis_cmstatus_e_t_mac_removal,
9741      {"Event Type: MAC Removal event", "docsis_cmstatus.mac_removal", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9742     },
9743     {&hf_docsis_cmstatus_e_t_ds_ofdm_profile_failure,
9744      {"Event Type: DS OFDM profile failure", "docsis_cmstatus.ds_ofdm_profile_failure", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9745     },
9746     {&hf_docsis_cmstatus_e_t_prim_ds_change,
9747      {"Event Type: Primary Downstream Change", "docsis_cmstatus.primary_downstream_change", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9748     },
9749     {&hf_docsis_cmstatus_e_t_dpd_mismatch,
9750      {"Event Type: DPD Mismatch", "docsis_cmstatus.dpd_mismatch", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9751     },
9752     {&hf_docsis_cmstatus_e_t_ncp_profile_failure,
9753      {"Event Type: NCP Profile failure", "docsis_cmstatus.ncp_profile_failure", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9754     },
9755     {&hf_docsis_cmstatus_e_t_plc_failure,
9756      {"Event Type: PLC failure", "docsis_cmstatus.plc_failure", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9757     },
9758     {&hf_docsis_cmstatus_e_t_ncp_profile_recovery,
9759      {"Event Type: NCP profile recovery", "docsis_cmstatus.ncp_profile_recovery", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9760     },
9761     {&hf_docsis_cmstatus_e_t_plc_recovery,
9762      {"Event Type: PLC recovery", "docsis_cmstatus.plc_recovery", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9763     },
9764     {&hf_docsis_cmstatus_e_t_ofdm_profile_recovery,
9765      {"Event Type: OFDM profile recovery", "docsis_cmstatus.ofdm_profile_recovery", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9766     },
9767     {&hf_docsis_cmstatus_e_t_ofdma_profile_failure,
9768      {"Event Type: OFDMA profile failure", "docsis_cmstatus.ofdma_profile_failure", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9769     },
9770     {&hf_docsis_cmstatus_e_t_map_storage_overflow_indicator,
9771      {"Event Type: MAP Storage overflow indicator", "docsis_cmstatus.map_storage_overflow_indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9772     },
9773     {&hf_docsis_cmstatus_e_t_map_storage_almost_full_indicator,
9774      {"Event Type: MAP Storage almost full indicator", "docsis_cmstatus.map_storage_almost_full_indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9775     },
9776     {&hf_docsis_cmstatus_e_t_unknown,
9777      {"Unknown Event Type", "docsis_cmstatus.unknown_event_type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9778     },
9779     {&hf_docsis_cmstatus_status_event_descr,
9780      {"Description", "docsis_cmstatus.status_event.description",FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9781     },
9782     {&hf_docsis_cmstatus_status_event_ds_ch_id,
9783      {"Downstream Channel ID", "docsis_cmstatus.status_event.ds_chid",FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9784     },
9785     {&hf_docsis_cmstatus_status_event_us_ch_id,
9786      {"Upstream Channel ID", "docsis_cmstatus.status_event.us_chid",FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9787     },
9788     {&hf_docsis_cmstatus_status_event_dsid,
9789      {"DSID", "docsis_cmstatus.status_event.dsid", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL}
9790     },
9791     {&hf_docsis_cmstatus_status_event_mac_address,
9792      {"MAC Address", "docsis_cmstatus.status_event.mac_address", FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL}
9793     },
9794     {&hf_docsis_cmstatus_status_event_ds_ofdm_profile_id,
9795      {"Downstream OFDM Profile ID", "docsis_cmstatus.status_event.ds_ofdm_profile_id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9796     },
9797     {&hf_docsis_cmstatus_status_event_us_ofdma_profile_id,
9798      {"US OFDMA Profile ID", "docsis_cmstatus.status_event.us_ofdma_profile_id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9799     },
9800     {&hf_docsis_cmstatus_tlv_data,
9801      {"TLV Data", "docsis_cmstatus.tlv_data", FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
9802     },
9803     {&hf_docsis_cmstatus_type,
9804      {"Type", "docsis_cmstatus.type",FT_UINT8, BASE_DEC, VALS(cmstatus_tlv_vals), 0x0, NULL, HFILL}
9805     },
9806     {&hf_docsis_cmstatus_length,
9807      {"Length", "docsis_cmstatus.length",FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9808     },
9809     {&hf_docsis_cmstatus_status_event_tlv_data,
9810      {"Status Event TLV Data", "docsis_cmstatus.status_event.tlv_data", FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
9811     },
9812     {&hf_docsis_cmstatus_status_event_type,
9813      {"Status Event Type", "docsis_cmstatus.status_event.type",FT_UINT8, BASE_DEC, VALS(cmstatus_status_event_tlv_vals), 0x0, NULL, HFILL}
9814     },
9815     {&hf_docsis_cmstatus_status_event_length,
9816      {"Status Event Length", "docsis_cmstatus.status_event.length",FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9817     },
9818 
9819     /* CM_CTRL_REQ */
9820     {&hf_docsis_cmctrl_tlv_mute,
9821      {"Upstream Channel RF Mute", "docsis_cmctrl.mute",
9822       FT_UINT8, BASE_DEC, NULL, 0x0,
9823       NULL, HFILL}
9824     },
9825     {&hf_docsis_cmctrl_tlv_mute_timeout,
9826      {"RF Mute Timeout Interval", "docsis_cmctrl.mute_timeout",
9827       FT_UINT32, BASE_DEC, NULL, 0x0,
9828       NULL, HFILL}
9829     },
9830     {&hf_docsis_cmctrl_tlv_reinit,
9831      {"CM Reinitialize", "docsis_cmctrl.reinit",
9832       FT_UINT8, BASE_DEC, NULL, 0x0,
9833       NULL, HFILL}
9834     },
9835     {&hf_docsis_cmctrl_tlv_disable_fwd,
9836      {"Disable Forwarding", "docsis_cmctrl.disable_fwd",
9837       FT_UINT8, BASE_DEC, NULL, 0x0,
9838       NULL, HFILL}
9839     },
9840     {&hf_docsis_cmctrl_tlv_ds_event,
9841      {"Override Downstream Events", "docsis_cmctrl.ds_event",
9842       FT_BYTES, BASE_NONE, NULL, 0x0,
9843       NULL, HFILL}
9844     },
9845     {&hf_docsis_cmctrl_tlv_us_event,
9846      {"Override Upstream Events", "docsis_cmctrl.us_event",
9847       FT_BYTES, BASE_NONE, NULL, 0x0,
9848       NULL, HFILL}
9849     },
9850     {&hf_docsis_cmctrl_tlv_event,
9851      {"Override Non-Channel-Specific Events", "docsis_cmctrl.event",
9852       FT_BYTES, BASE_NONE, NULL, 0x0,
9853       NULL, HFILL}
9854     },
9855     {&hf_docsis_cmctrlreq_tlv_data,
9856      {"TLV Data", "docsis_cmctrl.tlv_data",
9857       FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0,
9858       NULL, HFILL}
9859     },
9860     {&hf_docsis_cmctrlreq_type,
9861      {"Type", "docsis_cmctrl.tlv_type",
9862       FT_UINT8, BASE_DEC, VALS(cmctrlreq_tlv_vals), 0x0,
9863       NULL, HFILL}
9864     },
9865     {&hf_docsis_cmctrlreq_length,
9866      {"Length", "docsis_cmctrl.tlv_length",
9867       FT_UINT8, BASE_DEC, NULL, 0x0,
9868       NULL, HFILL}
9869     },
9870     {&hf_docsis_cmctrlreq_us_type,
9871      {"Type", "docsis_cmctrl.us_event_type",
9872       FT_UINT8, BASE_DEC, VALS(cmctrlreq_us_tlv_vals), 0x0,
9873       NULL, HFILL}
9874     },
9875     {&hf_docsis_cmctrlreq_us_length,
9876      {"Length", "docsis_cmctrl.us_event_length",
9877       FT_UINT8, BASE_DEC, NULL, 0x0,
9878       NULL, HFILL}
9879     },
9880     {&hf_docsis_cmctrl_us_event_ch_id,
9881      {"Upstream Channel ID", "docsis_cmctrl.us_event.chid",
9882       FT_UINT8, BASE_DEC, NULL, 0x0,
9883       NULL, HFILL}
9884     },
9885     {&hf_docsis_cmctrl_us_event_mask,
9886      {"Upstream Status Event Enable Bitmask", "docsis_cmctrl.us_event.mask",
9887       FT_BYTES, BASE_NONE, NULL, 0x0,
9888       NULL, HFILL}
9889     },
9890     {&hf_docsis_cmctrl_ds_type,
9891      {"Type", "docsis_cmctrl.ds_event_type",
9892       FT_UINT8, BASE_DEC, VALS(cmctrlreq_ds_tlv_vals), 0x0,
9893       NULL, HFILL}
9894     },
9895     {&hf_docsis_cmctrl_ds_length,
9896      {"Length", "docsis_cmctrl.ds_event_length",
9897       FT_UINT8, BASE_DEC, NULL, 0x0,
9898       NULL, HFILL}
9899     },
9900     {&hf_docsis_cmctrl_ds_event_ch_id,
9901      {"Downstream Channel ID", "docsis_cmctrl.ds_event.chid",
9902       FT_UINT8, BASE_DEC, NULL, 0x0,
9903       NULL, HFILL}
9904     },
9905     {&hf_docsis_cmctrl_ds_event_mask,
9906      {"Downstream Status Event Enable Bitmask", "docsis_cmctrl.ds_event.mask",
9907       FT_BYTES, BASE_NONE, NULL, 0x0,
9908       NULL, HFILL}
9909     },
9910     /* REG_REQ_MP */
9911     {&hf_docsis_regreqmp_sid,
9912      {"Sid", "docsis_regreqmp.sid",
9913       FT_UINT16, BASE_DEC, NULL, 0x0,
9914       "Reg-Req-Mp Sid", HFILL}
9915     },
9916     {&hf_docsis_regreqmp_number_of_fragments,
9917      {"Number of Fragments", "docsis_regreqmp.number_of_fragments",
9918       FT_UINT8, BASE_DEC, NULL, 0x0,
9919       "Reg-Req-Mp Number of Fragments", HFILL}
9920     },
9921     {&hf_docsis_regreqmp_fragment_sequence_number,
9922      {"Fragment Sequence Number", "docsis_regreqmp.fragment_sequence_number",
9923       FT_UINT8, BASE_DEC, NULL, 0x0,
9924       "Reg-Req-Mp Fragment Sequence Number", HFILL}
9925     },
9926     /* REG_RSP_MP */
9927     {&hf_docsis_regrspmp_sid,
9928      {"Sid", "docsis_regrspmp.sid",
9929       FT_UINT16, BASE_DEC, NULL, 0x0,
9930       "Reg-Rsp-Mp Sid", HFILL}
9931     },
9932     {&hf_docsis_regrspmp_response,
9933      {"Response", "docsis_regrspmp.response",
9934       FT_UINT8, BASE_DEC, NULL, 0x0,
9935       "Reg-Rsp-Mp Response", HFILL}
9936     },
9937     {&hf_docsis_regrspmp_number_of_fragments,
9938      {"Number of Fragments", "docsis_regrspmp.number_of_fragments",
9939       FT_UINT8, BASE_DEC, NULL, 0x0,
9940       "Reg-Rsp-Mp Number of Fragments", HFILL}
9941     },
9942     {&hf_docsis_regrspmp_fragment_sequence_number,
9943      {"Fragment Sequence Number", "docsis_regrspmp.fragment_sequence_number",
9944       FT_UINT8, BASE_DEC, NULL, 0x0,
9945       "Reg-Rsp-Mp Fragment Sequence Number", HFILL}
9946     },
9947     /* EM */
9948     {&hf_docsis_emrsp_tlv_data,
9949      {"Energy Management TLV data", "docsis_emrsp.tlv_data",
9950       FT_BYTES, BASE_NONE, NULL, 0x0,
9951       NULL, HFILL}
9952     },
9953     {&hf_docsis_emrsp_tlv_type,
9954      {"Energy Management TLV Type", "docsis_emrsp.tlv.type",
9955       FT_UINT8, BASE_DEC, VALS(emrsp_tlv_vals), 0x0,
9956       NULL, HFILL}
9957     },
9958     {&hf_docsis_emrsp_tlv_length,
9959      {"Energy Management TLV Length", "docsis_emrsp.tlv.length",
9960       FT_UINT8, BASE_DEC, NULL, 0x0,
9961       NULL, HFILL}
9962     },
9963     {&hf_docsis_emrsp_tlv_holdoff_timer,
9964      {"Hold-Off Timer", "docsis_emrsp.tlv.holdoff_timer",
9965       FT_UINT16, BASE_DEC, NULL, 0x0,
9966       NULL, HFILL}
9967     },
9968     {&hf_docsis_emreq_req_power_mode,
9969      {"Requested Power Mode", "docsis_emreq.req_power_mode",
9970       FT_UINT8, BASE_DEC, VALS(emreq_req_power_mode_vals), 0x0,
9971       NULL, HFILL}
9972     },
9973     {&hf_docsis_emreq_reserved,
9974      {"Reserved", "docsis_emreq.reserved",
9975       FT_UINT8, BASE_HEX, NULL, 0x0,
9976       NULL, HFILL}
9977     },
9978     {&hf_docsis_emrsp_rsp_code,
9979      {"Response Code", "docsis_emrsp.resp_code",
9980       FT_UINT8, BASE_DEC, VALS(emrsp_rsp_code_vals), 0x0,
9981       NULL, HFILL}
9982     },
9983     {&hf_docsis_emrsp_reserved,
9984      {"Reserved", "docsis_emrsp.reserved",
9985       FT_UINT8, BASE_HEX, NULL, 0x0,
9986       NULL, HFILL}
9987     },
9988     {&hf_docsis_emrsp_tlv_unknown,
9989       {"Unknown TLV", "docsis_emrsp.unknown_tlv",
9990        FT_BYTES, BASE_NONE, NULL, 0x0,
9991        NULL, HFILL}
9992     },
9993     /* OCD */
9994     {&hf_docsis_ocd_tlv_unknown,
9995       {"Unknown TLV", "docsis_ocd.unknown_tlv", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9996     },
9997     {&hf_docsis_ocd_ccc,
9998       {"Configuration Change Count", "docsis_ocd.ccc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9999     },
10000     {&hf_docsis_ocd_tlv_four_trans_size,
10001       {"Discrete Fourier Transform Size", "docsis_ocd.tlv.four_trans_size", FT_UINT8, BASE_DEC, VALS (docsis_ocd_four_trans_size), 0x0, NULL, HFILL}
10002     },
10003     {&hf_docsis_ocd_tlv_cycl_pref,
10004       {"Cyclic Prefix", "docsis_ocd.tlv.cyc_pref", FT_UINT8, BASE_DEC, VALS (docsis_ocd_cyc_prefix), 0x0, NULL, HFILL}
10005     },
10006     {&hf_docsis_ocd_tlv_roll_off,
10007       {"Roll Off", "docsis_ocd.tlv.roll_off", FT_UINT8, BASE_DEC, VALS (docsis_ocd_roll_off), 0x0, NULL, HFILL}
10008     },
10009     {&hf_docsis_ocd_tlv_ofdm_spec_loc,
10010       {"OFDM Spectrum Location", "docsis_ocd.tlv.ofdm_spec_loc", FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &local_units_hz, 0x0, NULL, HFILL}
10011     },
10012     {&hf_docsis_ocd_tlv_time_int_depth,
10013       {"Time Interleaving Depth", "docsis_ocd.tlv.time_int_depth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10014     },
10015     {&hf_docsis_ocd_tlv_prim_cap_ind,
10016       {"Primary Capable Indicator", "docsis_ocd.tlv.prim_cap_ind", FT_UINT8, BASE_DEC, VALS(docsis_ocd_prim_cap_ind_str), 0x0, NULL, HFILL}
10017     },
10018     {&hf_docsis_ocd_tlv_subc_assign_type,
10019       {"Assignment type", "docsis_ocd.tlv.subc_assign.type", FT_UINT8, BASE_DEC, VALS(docsis_ocd_subc_assign_type_str), 0xC0, NULL, HFILL}
10020     },
10021     {&hf_docsis_ocd_tlv_subc_assign_value,
10022       {"Assignment value", "docsis_ocd.tlv.subc_assign.value", FT_UINT8, BASE_DEC, VALS(docsis_ocd_subc_assign_value_str), 0x20, NULL, HFILL}
10023     },
10024     {&hf_docsis_ocd_subc_assign_subc_type,
10025       {"Subcarrier Type", "docsis_ocd.tlv.subc_assign.subc_type", FT_UINT8, BASE_DEC, VALS(docsis_ocd_subc_assign_subc_type_str), 0x1F, NULL, HFILL}
10026     },
10027     {&hf_docsis_ocd_subc_assign_range,
10028       {"Subcarrier index range", "docsis_ocd.tlv.subc_assign.range", FT_UINT32, BASE_CUSTOM, CF_FUNC(subc_assign_range), 0x00, NULL, HFILL}
10029     },
10030     {&hf_docsis_ocd_subc_assign_index,
10031       {"Subcarrier index", "docsis_ocd.tlv.subc_assign.index", FT_UINT16, BASE_DEC, NULL, 0x00, NULL, HFILL}
10032     },
10033     {&hf_docsis_ocd_tlv_data,
10034      {"TLV Data", "docsis_ocd.tlv_data", FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
10035     },
10036     {&hf_docsis_ocd_type,
10037      {"Type", "docsis_ocd.type",FT_UINT8, BASE_DEC, VALS(ocd_tlv_vals), 0x0, NULL, HFILL}
10038     },
10039     {&hf_docsis_ocd_length,
10040      {"Length", "docsis_ocd.length",FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10041     },
10042     /* DPD */
10043     {&hf_docsis_dpd_tlv_unknown,
10044      {"Unknown TLV", "docsis_dpd.unknown_tlv",
10045       FT_BYTES, BASE_NONE, NULL, 0x0,
10046       NULL, HFILL}
10047     },
10048     {&hf_docsis_dpd_prof_id,
10049      {"Profile Identifier", "docsis_dpd.prof_id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10050     },
10051     {&hf_docsis_dpd_ccc,
10052      {"Configuration Change Count", "docsis_dpd.ccc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10053     },
10054     {&hf_docsis_dpd_tlv_subc_assign_type,
10055       {"Subcarrier Assignment Type", "docsis_dpd.tlv.subc_assign.type", FT_UINT8, BASE_DEC, VALS(docsis_dpd_subc_assign_type_str), 0xC0, NULL, HFILL}
10056     },
10057     {&hf_docsis_dpd_tlv_subc_assign_value,
10058       {"Subcarrier Assignment Value", "docsis_dpd.tlv.subc_assign.value", FT_UINT8, BASE_DEC, VALS(docsis_dpd_subc_assign_value_str), 0x20, NULL, HFILL}
10059     },
10060     {&hf_docsis_dpd_tlv_subc_assign_reserved,
10061       {"reserved", "docsis_dpd.tlv.subc_assign.reserved", FT_UINT8, BASE_DEC, NULL, 0x10, NULL, HFILL}
10062     },
10063     {&hf_docsis_dpd_tlv_subc_assign_modulation,
10064      {"Subcarrier Assignment Modulation", "docsis_dpd.tlv.subc_assign.modulation", FT_UINT8, BASE_DEC, VALS(docsis_dpd_subc_assign_modulation_str), 0x0F, NULL, HFILL}
10065     },
10066     {&hf_docsis_dpd_subc_assign_range,
10067      {"Subcarrier index range", "docsis_dpd.tlv.subc_assign.range", FT_UINT32, BASE_CUSTOM, CF_FUNC(subc_assign_range), 0x00, NULL, HFILL}
10068     },
10069     {&hf_docsis_dpd_subc_assign_index,
10070      {"Subcarrier index", "docsis_dpd.tlv.subc_assign.index", FT_UINT16, BASE_DEC, NULL, 0x00, NULL, HFILL}
10071     },
10072     {&hf_docsis_dpd_tlv_subc_assign_vector_oddness,
10073      {"Odd or even", "docsis_dpd.tlv.subc_assign_vect.oddness", FT_UINT8, BASE_DEC, VALS(docsis_dpd_tlv_subc_assign_vector_oddness_str), 0x80, NULL, HFILL}
10074     },
10075     {&hf_docsis_dpd_tlv_subc_assign_vector_reserved,
10076      {"Reserved", "docsis_dpd.tlv.subc_assign_vect.reserved", FT_UINT8, BASE_DEC, NULL, 0x60, NULL, HFILL}
10077     },
10078     {&hf_docsis_dpd_tlv_subc_assign_vector_subc_start,
10079      {"Subcarrier start", "docsis_dpd.tlv.subc_assign_vect.subc_start", FT_UINT16, BASE_DEC, NULL, 0x1FFF, NULL, HFILL}
10080     },
10081     {&hf_docsis_dpd_tlv_subc_assign_vector_modulation_odd,
10082      {"Modulation", "docsis_dpd.tlv.subc_assign_vect.modulation", FT_UINT8, BASE_DEC, VALS(docsis_dpd_tlv_subc_assign_vector_modulation_str), 0xF0, NULL, HFILL}
10083     },
10084     {&hf_docsis_dpd_tlv_subc_assign_vector_modulation_even,
10085      {"Modulation", "docsis_dpd.tlv.subc_assign_vect.modulation", FT_UINT8, BASE_DEC, VALS(docsis_dpd_tlv_subc_assign_vector_modulation_str), 0x0F, NULL, HFILL}
10086     },
10087     {&hf_docsis_dpd_tlv_data,
10088      {"TLV Data", "docsis_dpd.tlv_data", FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
10089     },
10090     {&hf_docsis_dpd_type,
10091      {"Type", "docsis_dpd.type",FT_UINT8, BASE_DEC, VALS(dpd_tlv_vals), 0x0, NULL, HFILL}
10092     },
10093     {&hf_docsis_dpd_length,
10094      {"Length", "docsis_dpd.length",FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10095     },
10096     /* OPT-REQ */
10097     {&hf_docsis_optreq_tlv_unknown,
10098      {"Unknown TLV", "docsis_optreq.unknown_tlv", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10099     },
10100     {&hf_docsis_optreq_reserved,
10101      {"Reserved", "docsis_optreq.reserved", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10102     },
10103     {&hf_docsis_optreq_prof_id,
10104      {"Profile Identifier", "docsis_optreq.prof_id", FT_UINT8, BASE_DEC, VALS(profile_id_vals), 0x0, NULL, HFILL}
10105     },
10106     {&hf_docsis_optreq_opcode,
10107      {"Opcode", "docsis_optreq.opcode", FT_UINT8, BASE_DEC, VALS(opt_opcode_vals), 0x0, NULL, HFILL}
10108     },
10109     {&hf_docsis_optreq_tlv_data,
10110      {"TLV Data", "docsis_optreq.tlv_data", FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
10111     },
10112     {&hf_docsis_optreq_type,
10113      {"Type", "docsis_optreq.type",FT_UINT8, BASE_DEC, VALS(optreq_tlv_vals), 0x0, NULL, HFILL}
10114     },
10115     {&hf_docsis_optreq_length,
10116      {"Length", "docsis_optreq.length",FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10117     },
10118     {&hf_docsis_optreq_reqstat_rxmer_stat_subc,
10119      {"RxMER Statistics per subcarrier", "docsis_optreq.reqstat.rxmer_stat_per_subcarrier", FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x1, NULL, HFILL}
10120     },
10121     {&hf_docsis_optreq_reqstat_rxmer_subc_threshold_comp,
10122      {"RxMER per Subcarrier Threshold Comparison for Candidate Profile", "docsis_optreq.reqstat.rxmer_per_subcarrier_thresh_comp", FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x2, NULL, HFILL}
10123     },
10124     {&hf_docsis_optreq_reqstat_snr_marg_cand_prof,
10125      {"SNR Margin for Candidate Profile", "docsis_optreq.reqstat.snr_marg_cand_prof", FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x4, NULL, HFILL}
10126     },
10127     {&hf_docsis_optreq_reqstat_codew_stat_cand_prof,
10128      {"Codeword Statistics for Candidate Profile", "docsis_optreq.reqstat.codew_stat_cand_prof", FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x8, NULL, HFILL}
10129     },
10130     {&hf_docsis_optreq_reqstat_codew_thresh_comp_cand_prof,
10131      {"Codeword Threshold Comparison for Candidate Profile", "docsis_optreq.reqstat.codew_thresh_comp_cand_prof", FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x10, NULL, HFILL}
10132     },
10133     {&hf_docsis_optreq_reqstat_ncp_field_stat,
10134      {"NCP Field Statistics", "docsis_optreq.reqstat.ncp_field_stats", FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x20, NULL, HFILL}
10135     },
10136     {&hf_docsis_optreq_reqstat_ncp_crc_thresh_comp,
10137      {"NCP CRC Threshold Comparison", "docsis_optreq.reqstat.ncp_crc_thresh_comp", FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x40, NULL, HFILL}
10138     },
10139     {&hf_docsis_optreq_reqstat_reserved,
10140      {"Reserved", "docsis_optreq.reqstat.reserved", FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x80, NULL, HFILL}
10141     },
10142     {&hf_docsis_optreq_tlv_xrmer_thresh_data,
10143      {"TLV Data", "docsis_optreq.rxmer_thresh_params.tlv_data", FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
10144     },
10145     {&hf_docsis_optreq_xmer_thresh_params_type,
10146      {"Type", "docsis_optreq.rxmer_thres_params.type",FT_UINT8, BASE_DEC, VALS(optreq_tlv_rxmer_thresh_params_vals), 0x0, NULL, HFILL}
10147     },
10148     {&hf_docsis_optreq_xmer_thresh_params_length,
10149      {"Length", "docsis_optreq.rxmer_thres_params.length",FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10150     },
10151     {&hf_docsis_optreq_tlv_xrmer_thresh_data_mod_order,
10152      {"Modulation Order", "docsis_optreq.rxmer_thres_params.mod_order", FT_UINT8, BASE_DEC, VALS(opreq_tlv_rxmer_thresh_params_mod_order), 0x0, NULL, HFILL}
10153     },
10154     /* OPT-RSP */
10155     {&hf_docsis_optrsp_tlv_unknown,
10156      {"Unknown TLV", "docsis_optrsp.unknown_tlv", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10157     },
10158     {&hf_docsis_optrsp_reserved,
10159      {"Reserved", "docsis_optrsp.reserved", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10160     },
10161     {&hf_docsis_optrsp_prof_id,
10162      {"Profile Identifier", "docsis_optrsp.prof_id", FT_UINT8, BASE_DEC, VALS(profile_id_vals), 0x0, NULL, HFILL}
10163     },
10164     {&hf_docsis_optrsp_status,
10165      {"Status", "docsis_optrsp.status", FT_UINT8, BASE_DEC, VALS(opt_status_vals), 0x0, NULL, HFILL}
10166     },
10167     {&hf_docsis_optrsp_tlv_data,
10168      {"TLV Data", "docsis_optrsp.tlv_data", FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
10169     },
10170     {&hf_docsis_optrsp_type,
10171      {"Type", "docsis_optrsp.type",FT_UINT8, BASE_DEC, VALS(optreq_tlv_vals), 0x0, NULL, HFILL}
10172     },
10173     {&hf_docsis_optrsp_length,
10174      {"Length", "docsis_optrsp.length",FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10175     },
10176     {&hf_docsis_optrsp_tlv_xrmer_snr_margin_data,
10177      {"TLV Data", "docsis_optrsp.rxmer_snr_margin.tlv_data", FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
10178     },
10179     {&hf_docsis_optrsp_xmer_snr_margin_type,
10180      {"Type", "docsis_optrsp.xmer_snr_margin.type",FT_UINT8, BASE_DEC, VALS(optrsp_tlv_rxmer_snr_margin_vals), 0x0, NULL, HFILL}
10181     },
10182     {&hf_docsis_optrsp_xmer_snr_margin_length,
10183      {"Length", "docsis_optrsp.rxmer_snr_margin.length",FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10184     },
10185     {&hf_docsis_optrsp_tlv_xrmer_snr_margin_data_rxmer_subc,
10186      {"RxMER", "docsis_optrsp.rxmer_snr_margin.rxmer_per_subc", FT_UINT8, BASE_CUSTOM, CF_FUNC(fourth_db), 0x0, NULL, HFILL}
10187     },
10188     {&hf_docsis_optrsp_tlv_rxmer_snr_margin_data_snr_margin,
10189      {"SNR Margin", "docsis_optrsp.rxmer_snr_margin.snr_margin", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10190     },
10191     /* OPT-ACK */
10192     {&hf_docsis_optack_prof_id,
10193      {"Profile Identifier", "docsis_optack.prof_id", FT_UINT8, BASE_DEC, VALS(profile_id_vals), 0x0, NULL, HFILL}
10194     },
10195     {&hf_docsis_optack_reserved,
10196      {"Reserved", "docsis_optack.reserved", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10197     },
10198     /* RBA */
10199     {&hf_docsis_rba_tg_id,
10200      {"Transmission Group ID", "docsis_rba.tg_id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10201     },
10202     {&hf_docsis_rba_ccc,
10203      {"Change Count", "docsis_rba.ccc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10204     },
10205     {&hf_docsis_rba_dcid,
10206      {"Current Channel DCID", "docsis_rba.dcid", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10207     },
10208     {&hf_docsis_rba_control_byte_bitmask,
10209      {"Control byte bitmask", "docsis_rba.control_byte_bitmask", FT_UINT8, BASE_HEX, NULL, 0x00, NULL, HFILL}
10210     },
10211     {&hf_docsis_rba_resource_block_change_bit,
10212      {"Resource Block Change bit", "docsis_rba.rb_change_bit", FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL}
10213     },
10214     {&hf_docsis_rba_expiration_time_valid_bit,
10215      {"Expiration Time Valid bit", "docsis_rba.exp_time_valid_bit", FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL}
10216     },
10217     {&hf_docsis_rba_control_byte_bitmask_rsvd,
10218      {"Control byte bitmask reserved", "docsis_rba.control_byte_bitmask_rsvd", FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL}
10219     },
10220     {&hf_docsis_rba_rba_time,
10221      {"RBA Time", "docsis_rba.rba_time", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
10222     },
10223     {&hf_docsis_rba_rba_expiration_time,
10224      {"RBA Expiration Time", "docsis_rba.rba_expiration_time", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
10225     },
10226     {&hf_docsis_rba_number_of_subbands,
10227      {"Number of Sub-bands", "docsis_rba.nr_subbands", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10228     },
10229     {&hf_docsis_rba_subband_direction,
10230      {"Sub-band direction", "docsis_rba.subband_direction", FT_UINT8, BASE_DEC, VALS(rba_subband_direction_vals), 0x0, NULL, HFILL}
10231     },
10232 
10233     /* MAC Management */
10234     {&hf_docsis_mgt_upstream_chid,
10235      {"Upstream Channel ID", "docsis_mgmt.upchid",
10236       FT_UINT8, BASE_DEC, NULL, 0x0,
10237       NULL, HFILL}
10238     },
10239     {&hf_docsis_mgt_down_chid,
10240      {"Downstream Channel ID", "docsis_mgmt.downchid",
10241       FT_UINT8, BASE_DEC, NULL, 0x0,
10242       "Management Message", HFILL}
10243     },
10244     {&hf_docsis_mgt_tranid,
10245      {"Transaction ID", "docsis_mgmt.tranid",
10246       FT_UINT16, BASE_DEC, NULL, 0x0,
10247       NULL, HFILL}
10248     },
10249     {&hf_docsis_mgt_dst_addr,
10250      {"Destination Address", "docsis_mgmt.dst",
10251       FT_ETHER, BASE_NONE, NULL, 0x0,
10252       NULL, HFILL}
10253     },
10254     {&hf_docsis_mgt_src_addr,
10255      {"Source Address", "docsis_mgmt.src",
10256       FT_ETHER, BASE_NONE, NULL, 0x0,
10257       NULL, HFILL}
10258     },
10259     {&hf_docsis_mgt_msg_len,
10260      {"Message Length - DSAP to End (Bytes)", "docsis_mgmt.msglen",
10261       FT_UINT16, BASE_DEC, NULL, 0x0,
10262       NULL, HFILL}
10263     },
10264     {&hf_docsis_mgt_dsap,
10265      {"DSAP", "docsis_mgmt.dsap",
10266       FT_UINT8, BASE_HEX, NULL, 0x0,
10267       "Destination SAP", HFILL}
10268     },
10269     {&hf_docsis_mgt_ssap,
10270      {"SSAP", "docsis_mgmt.ssap",
10271       FT_UINT8, BASE_HEX, NULL, 0x0,
10272       "Source SAP", HFILL}
10273     },
10274     {&hf_docsis_mgt_30_transmit_power,
10275      {"Upstream Transmit Power, sent to 3.0 CMTS", "docsis_mgmt.30_transmit_power",
10276       FT_UINT8, BASE_CUSTOM, CF_FUNC(fourth_db), 0x0,
10277       NULL, HFILL}
10278     },
10279     {&hf_docsis_mgt_31_transmit_power,
10280      {"Upstream Transmit Power, sent to 3.1 CMTS", "docsis_mgmt.31_transmit_power",
10281       FT_UINT16, BASE_CUSTOM, CF_FUNC(fourth_db), 0x1FF,
10282       NULL, HFILL}
10283     },
10284     {&hf_docsis_mgt_control,
10285      {"Control", "docsis_mgmt.control",
10286       FT_UINT8, BASE_HEX, NULL, 0x0,
10287       NULL, HFILL}
10288     },
10289     {&hf_docsis_mgt_version,
10290      {"Version", "docsis_mgmt.version",
10291       FT_UINT8, BASE_DEC, NULL, 0x0,
10292       NULL, HFILL}
10293     },
10294     {&hf_docsis_mgt_type,
10295      {"Type", "docsis_mgmt.type",
10296       FT_UINT8, BASE_DEC, VALS (mgmt_type_vals), 0x0,
10297       NULL, HFILL}
10298     },
10299     {&hf_docsis_mgt_rsvd,
10300      {"Reserved", "docsis_mgmt.rsvd",
10301       FT_UINT8, BASE_DEC, NULL, 0x0,
10302       NULL, HFILL}
10303     },
10304     {&hf_docsis_mgt_multipart,
10305      {"Multipart", "docsis_mgmt.multipart",
10306       FT_UINT8, BASE_HEX, NULL, 0x0,
10307       NULL, HFILL}
10308     },
10309     {&hf_docsis_mgt_multipart_number_of_fragments,
10310      {"Multipart - Number of Fragments", "docsis_mgmt.multipart.number_of_fragments",
10311       FT_UINT8, BASE_CUSTOM, CF_FUNC(multipart_number_of_fragments), 0xF0,
10312       NULL, HFILL}
10313     },
10314     {&hf_docsis_mgt_multipart_fragment_sequence_number,
10315      {"Multipart - Fragment Sequence Number", "docsis_mgmt.multipart.fragment_sequence_number",
10316       FT_UINT8, BASE_DEC, NULL, 0x0F,
10317       NULL, HFILL}
10318     },
10319     { &hf_docsis_tlv_fragment_overlap,
10320      { "Fragment overlap", "docsis_mgmt.tlv.fragment.overlap",
10321        FT_BOOLEAN, BASE_NONE, NULL, 0x0,
10322        "Fragment overlaps with other fragments", HFILL}
10323     },
10324     { &hf_docsis_tlv_fragment_overlap_conflict,
10325      { "Conflicting data in fragment overlap", "docsis_mgmt.tlv.fragment.overlap.conflict",
10326        FT_BOOLEAN, BASE_NONE, NULL, 0x0,
10327        "Overlapping fragments contained conflicting data", HFILL}
10328     },
10329     { &hf_docsis_tlv_fragment_multiple_tails,
10330      { "Multiple tail fragments found", "docsis_mgmt.tlv.fragment.multipletails",
10331        FT_BOOLEAN, BASE_NONE, NULL, 0x0,
10332        "Several tails were found when defragmenting the packet", HFILL}
10333     },
10334     { &hf_docsis_tlv_fragment_too_long_fragment,
10335      { "Fragment too long", "docsis_mgmt.tlv.fragment.toolongfragment",
10336        FT_BOOLEAN, BASE_NONE, NULL, 0x0,
10337        "Fragment contained data past end of packet", HFILL}
10338     },
10339     { &hf_docsis_tlv_fragment_error,
10340      { "Defragmentation error", "docsis_mgmt.tlv.fragment.error",
10341        FT_FRAMENUM, BASE_NONE, NULL, 0x0,
10342        "Defragmentation error due to illegal fragments", HFILL}
10343     },
10344     { &hf_docsis_tlv_fragment_count,
10345      { "Fragment count", "docsis_mgmt.tlv.fragment.count",
10346        FT_UINT32, BASE_DEC, NULL, 0x0,
10347        NULL, HFILL}
10348     },
10349     { &hf_docsis_tlv_fragment,
10350      { "TLV Fragment", "docsis_mgmt.tlv.fragment",
10351        FT_FRAMENUM, BASE_NONE, NULL, 0x0,
10352        NULL, HFILL}
10353     },
10354     { &hf_docsis_tlv_fragments,
10355      { "TLV Fragments", "docsis_mgmt.tlv.fragments",
10356        FT_BYTES, BASE_NONE, NULL, 0x0,
10357        NULL, HFILL}
10358     },
10359     { &hf_docsis_tlv_reassembled_in,
10360      { "Reassembled TLV in frame", "docsis_mgmt.tlv.reassembled_in",
10361        FT_FRAMENUM, BASE_NONE, NULL, 0x0,
10362        "This TLV packet is reassembled in this frame", HFILL}
10363     },
10364     { &hf_docsis_tlv_reassembled_length,
10365      { "Reassembled TLV length", "docsis_mgmt.tlv.reassembled.length",
10366        FT_UINT32, BASE_DEC, NULL, 0x0,
10367        "The total length of the reassembled payload", HFILL}
10368     },
10369     { &hf_docsis_tlv_reassembled_data,
10370      { "Reassembled TLV data", "docsis_mgmt.tlv.reassembled.data",
10371        FT_BYTES, BASE_NONE, NULL, 0x0,
10372        "The reassembled payload", HFILL}
10373     },
10374     { &hf_docsis_tlv_reassembled,
10375      { "Reassembled TLV", "docsis_mgmt.tlv.reassembled",
10376        FT_BYTES, BASE_NONE, NULL, 0x0,
10377        NULL, HFILL}
10378     },
10379   };
10380 
10381   static gint *ett[] = {
10382     &ett_docsis_sync,
10383     &ett_docsis_ucd,
10384     &ett_docsis_tlv,
10385     &ett_docsis_burst_tlv,
10386     &ett_docsis_map,
10387     &ett_docsis_map_ie,
10388     &ett_docsis_map_probe_ie,
10389     &ett_docsis_rngreq,
10390     &ett_docsis_rngrsp,
10391     &ett_docsis_rngrsptlv,
10392     &ett_docsis_rngrsp_tlv_transmit_equalization_encodings,
10393     &ett_docsis_rngrsp_tlv_transmit_equalization_encodings_coef,
10394     &ett_docsis_rngrsp_tlv_commanded_power,
10395     &ett_docsis_rngrsp_tlv_commanded_power_subtlv,
10396     &ett_docsis_regreq,
10397     &ett_docsis_regrsp,
10398     &ett_docsis_uccreq,
10399     &ett_docsis_uccrsp,
10400     &ett_docsis_bpkmreq,
10401     &ett_docsis_bpkmrsp,
10402     &ett_docsis_bpkmattr,
10403     &ett_docsis_bpkmattr_cmid,
10404     &ett_docsis_bpkmattr_scap,
10405     &ett_docsis_bpkmattr_tekp,
10406     &ett_docsis_bpkmattr_sadsc,
10407     &ett_docsis_bpkmattr_saqry,
10408     &ett_docsis_bpkmattr_dnld,
10409     &ett_docsis_bpkmattrtlv,
10410     &ett_docsis_regack,
10411     &ett_docsis_dsareq,
10412     &ett_docsis_dsarsp,
10413     &ett_docsis_dsaack,
10414     &ett_docsis_dscreq,
10415     &ett_docsis_dscrsp,
10416     &ett_docsis_dscack,
10417     &ett_docsis_dsdreq,
10418     &ett_docsis_dsdrsp,
10419     &ett_docsis_dccreq,
10420     &ett_docsis_dccreq_sf_sub,
10421     &ett_docsis_dccreq_ds_params,
10422     &ett_docsis_dccreq_tlv,
10423     &ett_docsis_dccrsp,
10424     &ett_docsis_dccrsp_cm_jump_time,
10425     &ett_docsis_dccrsp_tlv,
10426     &ett_docsis_dccack,
10427     &ett_docsis_dccack_tlv,
10428     &ett_docsis_intrngreq,
10429     &ett_docsis_dcd,
10430     &ett_docsis_dcd_cfr,
10431     &ett_docsis_dcd_cfr_ip,
10432     &ett_docsis_dcd_rule,
10433     &ett_docsis_dcd_clid,
10434     &ett_docsis_dcd_cfg,
10435     &ett_docsis_dcd_tlv,
10436     &ett_docsis_mdd,
10437     &ett_tlv,
10438     &ett_sub_tlv,
10439     &ett_docsis_mdd_cm_status_ev_en_for_docsis31,
10440     &ett_docsis_mdd_ds_active_channel_list,
10441     &ett_docsis_mdd_ds_service_group,
10442     &ett_docsis_mdd_channel_profile_reporting_control,
10443     &ett_docsis_mdd_ip_init_param,
10444     &ett_docsis_mdd_up_active_channel_list,
10445     &ett_docsis_mdd_upstream_active_channel_list_dschids_maps_ucds_dschids,
10446     &ett_docsis_mdd_cm_status_event_control,
10447     &ett_docsis_mdd_dsg_da_to_dsid,
10448     &ett_docsis_mdd_diplexer_band_edge,
10449     &ett_docsis_mdd_full_duplex_descriptor,
10450     &ett_docsis_mdd_full_duplex_sub_band_descriptor,
10451     &ett_docsis_bintrngreq,
10452     &ett_docsis_dbcreq,
10453     &ett_docsis_dbcrsp,
10454     &ett_docsis_dbcack,
10455     &ett_docsis_dpvreq,
10456     &ett_docsis_dpvrsp,
10457     &ett_docsis_cmstatus,
10458     &ett_docsis_cmstatus_tlv,
10459     &ett_docsis_cmstatus_tlvtlv,
10460     &ett_docsis_cmstatus_status_event_tlv,
10461     &ett_docsis_cmstatus_status_event_tlvtlv,
10462     &ett_docsis_cmstatusack,
10463     &ett_docsis_cmctrlreq,
10464     &ett_docsis_cmctrlreq_tlv,
10465     &ett_docsis_cmctrlreq_tlvtlv,
10466     &ett_docsis_cmctrl_tlv_us_event,
10467     &ett_docsis_cmctrl_tlv_ds_event,
10468     &ett_docsis_cmctrlrsp,
10469     &ett_docsis_regreqmp,
10470     &ett_docsis_regrspmp,
10471     &ett_docsis_emreq,
10472     &ett_docsis_emrsp,
10473     &ett_docsis_emrsp_tlv,
10474     &ett_docsis_emrsp_tlvtlv,
10475     &ett_docsis_ocd,
10476     &ett_docsis_ocd_tlv,
10477     &ett_docsis_ocd_tlvtlv,
10478     &ett_docsis_dpd,
10479     &ett_docsis_dpd_tlv,
10480     &ett_docsis_dpd_tlvtlv,
10481     &ett_docsis_dpd_tlv_subcarrier_assignment,
10482     &ett_docsis_dpd_tlv_subcarrier_assignment_vector,
10483     &ett_docsis_optreq,
10484     &ett_docsis_optreq_tlv,
10485     &ett_docsis_optreq_tlvtlv,
10486     &ett_docsis_optreq_tlv_rxmer_thresh_params,
10487     &ett_docsis_optreq_tlv_rxmer_thresh_params_tlv,
10488     &ett_docsis_optrsp,
10489     &ett_docsis_optrsp_tlv,
10490     &ett_docsis_optrsp_tlvtlv,
10491     &ett_docsis_optrsp_tlv_rxmer_snr_margin_data,
10492     &ett_docsis_optrsp_tlv_rxmer_snr_margin_tlv,
10493     &ett_docsis_optack,
10494     &ett_docsis_rba,
10495     &ett_docsis_rba_control_byte,
10496     &ett_docsis_mgmt,
10497     &ett_mgmt_pay,
10498     &ett_docsis_tlv_fragment,
10499     &ett_docsis_tlv_fragments,
10500     &ett_docsis_tlv_reassembled
10501   };
10502 
10503   static ei_register_info ei[] = {
10504     {&ei_docsis_mgmt_tlvlen_bad, {"docsis_mgmt.tlvlenbad", PI_MALFORMED, PI_ERROR, "Bad TLV length", EXPFILL}},
10505     {&ei_docsis_mgmt_tlvtype_unknown, { "docsis_mgmt.tlvtypeunknown", PI_PROTOCOL, PI_WARN, "Unknown TLV type", EXPFILL}},
10506     {&ei_docsis_mgmt_version_unknown, { "docsis_mgmt.versionunknown", PI_PROTOCOL, PI_WARN, "Unknown MAC management version", EXPFILL}},
10507    };
10508 
10509   expert_module_t* expert_docsis_mgmt;
10510 
10511   proto_docsis_mgmt = proto_register_protocol ("DOCSIS MAC Management", "DOCSIS MAC MGMT", "docsis_mgmt");
10512 
10513   proto_register_field_array (proto_docsis_mgmt, hf, array_length (hf));
10514   proto_register_subtree_array (ett, array_length (ett));
10515   expert_docsis_mgmt = expert_register_protocol(proto_docsis_mgmt);
10516   expert_register_field_array(expert_docsis_mgmt, ei, array_length(ei));
10517 
10518   docsis_mgmt_dissector_table = register_dissector_table ("docsis_mgmt",
10519                                                           "DOCSIS MAC Management", proto_docsis_mgmt,
10520                                                           FT_UINT8, BASE_DEC);
10521 
10522   /* Register MAC Management commands as their own protocols so we can get the name of the option */
10523   proto_docsis_sync = proto_register_protocol_in_name_only("DOCSIS Synchronisation Message", "SYNC Message", "docsis_sync", proto_docsis_mgmt, FT_BYTES);
10524   proto_docsis_ucd = proto_register_protocol_in_name_only("DOCSIS Upstream Channel Descriptor", "DOCSIS UCD", "docsis_ucd", proto_docsis_mgmt, FT_BYTES);
10525   proto_docsis_map_v1 = proto_register_protocol_in_name_only("DOCSIS Upstream Bandwidth Allocation - version 1", "DOCSIS MAP", "docsis_map", proto_docsis_mgmt, FT_BYTES);
10526   proto_docsis_map_v5 = proto_register_protocol_in_name_only("DOCSIS Upstream Bandwidth Allocation - version 5", "DOCSIS MAP", "docsis_map", proto_docsis_mgmt, FT_BYTES);
10527   proto_docsis_rngreq = proto_register_protocol_in_name_only("DOCSIS Range Request Message", "DOCSIS RNG-REQ", "docsis_rngreq", proto_docsis_mgmt, FT_BYTES);
10528   proto_docsis_rngrsp = proto_register_protocol_in_name_only("DOCSIS Ranging Response", "DOCSIS RNG-RSP", "docsis_rngrsp", proto_docsis_mgmt, FT_BYTES);
10529   proto_docsis_regreq = proto_register_protocol_in_name_only("DOCSIS Registration Requests", "DOCSIS REG-REQ", "docsis_regreq", proto_docsis_mgmt, FT_BYTES);
10530   proto_docsis_regrsp = proto_register_protocol_in_name_only("DOCSIS Registration Responses", "DOCSIS REG-RSP", "docsis_regrsp", proto_docsis_mgmt, FT_BYTES);
10531   proto_docsis_uccreq = proto_register_protocol_in_name_only("DOCSIS Upstream Channel Change Request", "DOCSIS UCC-REQ", "docsis_uccreq", proto_docsis_mgmt, FT_BYTES);
10532   proto_docsis_uccrsp = proto_register_protocol_in_name_only("DOCSIS Upstream Channel Change Response", "DOCSIS UCC-RSP", "docsis_uccrsp", proto_docsis_mgmt, FT_BYTES);
10533   proto_docsis_bpkmreq = proto_register_protocol_in_name_only("DOCSIS Baseline Privacy Key Management Request", "DOCSIS BPKM-REQ", "docsis_bpkm.req", proto_docsis_mgmt, FT_BYTES);
10534   proto_docsis_bpkmrsp = proto_register_protocol_in_name_only("DOCSIS Baseline Privacy Key Management Response", "DOCSIS BPKM-RSP", "docsis_bpkm.rsp", proto_docsis_mgmt, FT_BYTES);
10535   proto_docsis_regack = proto_register_protocol_in_name_only("DOCSIS Registration Acknowledge", "DOCSIS REG-ACK", "docsis_regack", proto_docsis_mgmt, FT_BYTES);
10536   proto_docsis_dsareq = proto_register_protocol_in_name_only("DOCSIS Dynamic Service Addition Request", "DOCSIS DSA-REQ", "docsis_dsareq", proto_docsis_mgmt, FT_BYTES);
10537   proto_docsis_dsarsp = proto_register_protocol_in_name_only("DOCSIS Dynamic Service Addition Response", "DOCSIS DSA-RSP", "docsis_dsarsp", proto_docsis_mgmt, FT_BYTES);
10538   proto_docsis_dsaack = proto_register_protocol_in_name_only("DOCSIS Dynamic Service Addition Acknowledge", "DOCSIS DSA-ACK", "docsis_dsaack", proto_docsis_mgmt, FT_BYTES);
10539   proto_docsis_dscreq = proto_register_protocol_in_name_only("DOCSIS Dynamic Service Change Request", "DOCSIS DSC-REQ", "docsis_dscreq", proto_docsis_mgmt, FT_BYTES);
10540   proto_docsis_dscrsp = proto_register_protocol_in_name_only("DOCSIS Dynamic Service Change Response", "DOCSIS DSC-RSP", "docsis_dscrsp", proto_docsis_mgmt, FT_BYTES);
10541   proto_docsis_dscack = proto_register_protocol_in_name_only("DOCSIS Dynamic Service Change Acknowledge", "DOCSIS DSC-ACK", "docsis_dscack", proto_docsis_mgmt, FT_BYTES);
10542   proto_docsis_dsdreq = proto_register_protocol_in_name_only("DOCSIS Dynamic Service Delete Request", "DOCSIS DSD-REQ", "docsis_dsdreq", proto_docsis_mgmt, FT_BYTES);
10543   proto_docsis_dsdrsp = proto_register_protocol_in_name_only("DOCSIS Dynamic Service Delete Response", "DOCSIS DSD-RSP", "docsis_dsdrsp", proto_docsis_mgmt, FT_BYTES);
10544   proto_docsis_dccreq = proto_register_protocol_in_name_only("DOCSIS Downstream Channel Change Request", "DOCSIS DCC-REQ", "docsis_dccreq", proto_docsis_mgmt, FT_BYTES);
10545   proto_docsis_dccrsp = proto_register_protocol_in_name_only("DOCSIS Downstream Channel Change Response", "DOCSIS DCC-RSP", "docsis_dccrsp", proto_docsis_mgmt, FT_BYTES);
10546   proto_docsis_dccack = proto_register_protocol_in_name_only("DOCSIS Downstream Channel Change Acknowledge", "DOCSIS DCC-ACK", "docsis_dccack", proto_docsis_mgmt, FT_BYTES);
10547   proto_docsis_type29ucd = proto_register_protocol_in_name_only("DOCSIS Upstream Channel Descriptor Type 29", "DOCSIS type29ucd", "docsis_type29ucd", proto_docsis_mgmt, FT_BYTES);
10548   proto_docsis_intrngreq = proto_register_protocol_in_name_only("DOCSIS Initial Ranging Message", "DOCSIS INT-RNG-REQ", "docsis_intrngreq", proto_docsis_mgmt, FT_BYTES);
10549   proto_docsis_dcd = proto_register_protocol_in_name_only("DOCSIS Downstream Channel Descriptor", "DOCSIS DCD", "docsis_dcd", proto_docsis_mgmt, FT_BYTES);
10550   proto_docsis_mdd = proto_register_protocol_in_name_only("DOCSIS MAC Domain Description", "DOCSIS MDD", "docsis_mdd", proto_docsis_mgmt, FT_BYTES);
10551   proto_docsis_bintrngreq = proto_register_protocol_in_name_only("DOCSIS Bonded Initial Ranging Message", "DOCSIS B-INT-RNG-REQ", "docsis_bintrngreq", proto_docsis_mgmt, FT_BYTES);
10552   proto_docsis_type35ucd = proto_register_protocol_in_name_only("DOCSIS Upstream Channel Descriptor Type 35", "DOCSIS type35ucd", "docsis_type35ucd", proto_docsis_mgmt, FT_BYTES);
10553   proto_docsis_dbcreq = proto_register_protocol_in_name_only("DOCSIS Dynamic Bonding Change Request", "DOCSIS DBC-REQ", "docsis_dbcreq", proto_docsis_mgmt, FT_BYTES);
10554   proto_docsis_dbcrsp = proto_register_protocol_in_name_only("DOCSIS Dynamic Bonding Change Response", "DOCSIS DBC-RSP", "docsis_dbcrsp", proto_docsis_mgmt, FT_BYTES);
10555   proto_docsis_dbcack = proto_register_protocol_in_name_only("DOCSIS Dynamic Bonding Change Acknowledge", "DOCSIS DBC-ACK", "docsis_dbcack", proto_docsis_mgmt, FT_BYTES);
10556   proto_docsis_dpvreq = proto_register_protocol_in_name_only("DOCSIS Path Verify Request", "DOCSIS DPV-REQ", "docsis_dpv.req", proto_docsis_mgmt, FT_BYTES);
10557   proto_docsis_dpvrsp = proto_register_protocol_in_name_only("DOCSIS Path Verify Response", "DOCSIS DPV-RSP", "docsis_dpv.rsp", proto_docsis_mgmt, FT_BYTES);
10558   proto_docsis_cmstatus = proto_register_protocol_in_name_only("DOCSIS CM-STATUS Report", "DOCSIS CM-STATUS", "docsis_cmstatus", proto_docsis_mgmt, FT_BYTES);
10559   proto_docsis_cmstatusack = proto_register_protocol_in_name_only("DOCSIS Status Report Acknowledge", "DOCSIS CM-STATUS-ACK", "docsis_cmstatusack", proto_docsis_mgmt, FT_BYTES);
10560   proto_docsis_cmctrlreq = proto_register_protocol_in_name_only("DOCSIS CM Control Request", "DOCSIS CM-CTRL-REQ", "docsis_cmctrl.req", proto_docsis_mgmt, FT_BYTES);
10561   proto_docsis_cmctrlrsp = proto_register_protocol_in_name_only("DOCSIS CM Control Response", "DOCSIS CM-CTRL-RSP", "docsis_cmctrlrsp", proto_docsis_mgmt, FT_BYTES);
10562   proto_docsis_regreqmp = proto_register_protocol_in_name_only("DOCSIS Registration Request Multipart", "DOCSIS Reg-Req-Mp", "docsis_regreqmp", proto_docsis_mgmt, FT_BYTES);
10563   proto_docsis_regrspmp = proto_register_protocol_in_name_only("DOCSIS Registration Response Multipart", "DOCSIS Reg-Rsp-Mp", "docsis_regrspmp", proto_docsis_mgmt, FT_BYTES);
10564   proto_docsis_emreq = proto_register_protocol_in_name_only("DOCSIS Energy Management Request", "DOCSIS EM-REQ", "docsis_emreq", proto_docsis_mgmt, FT_BYTES);
10565   proto_docsis_emrsp = proto_register_protocol_in_name_only("DOCSIS Energy Management Response", "DOCSIS EM-RSP", "docsis_emrsp", proto_docsis_mgmt, FT_BYTES);
10566   proto_docsis_ocd = proto_register_protocol_in_name_only("DOCSIS OFDM Channel Descriptor", "DOCSIS OCD", "docsis_ocd", proto_docsis_mgmt, FT_BYTES);
10567   proto_docsis_dpd = proto_register_protocol_in_name_only("DOCSIS Downstream Profile Descriptor", "DOCSIS DPD", "docsis_dpd", proto_docsis_mgmt, FT_BYTES);
10568   proto_docsis_type51ucd = proto_register_protocol_in_name_only("DOCSIS Upstream Channel Descriptor Type 51", "DOCSIS type51ucd", "docsis_type51ucd", proto_docsis_mgmt, FT_BYTES);
10569   proto_docsis_optreq = proto_register_protocol_in_name_only("OFDM Downstream Profile Test Request", "DOCSIS OPT-REQ", "docsis_optreq", proto_docsis_mgmt, FT_BYTES);
10570   proto_docsis_optrsp = proto_register_protocol_in_name_only("OFDM Downstream Profile Test Response", "DOCSIS OPT-RSP", "docsis_optrsp", proto_docsis_mgmt, FT_BYTES);
10571   proto_docsis_optack = proto_register_protocol_in_name_only("OFDM Downstream Profile Test Acknowledge", "DOCSIS OPT-ACK", "docsis_optack", proto_docsis_mgmt, FT_BYTES);
10572   proto_docsis_rba = proto_register_protocol_in_name_only("DOCSIS Resource Block Assignment Message", "DOCSIS RBA", "docsis_rba", proto_docsis_mgmt, FT_BYTES);
10573 
10574   register_dissector ("docsis_mgmt", dissect_macmgmt, proto_docsis_mgmt);
10575   docsis_ucd_handle = register_dissector ("docsis_ucd", dissect_ucd, proto_docsis_ucd);
10576 }
10577 
10578 void
10579 proto_reg_handoff_docsis_mgmt (void)
10580 {
10581   /* Create dissection function handles for all MAC Management commands */
10582   dissector_add_uint ("docsis_mgmt", MGT_SYNC, create_dissector_handle( dissect_sync, proto_docsis_sync ));
10583   dissector_add_uint ("docsis_mgmt", MGT_UCD, docsis_ucd_handle);
10584   dissector_add_uint ("docsis_mgmt", 256*MAP_v1 + MGT_MAP, create_dissector_handle( dissect_map_v1, proto_docsis_map_v1 ));
10585   dissector_add_uint ("docsis_mgmt", 256*MAP_v5 + MGT_MAP, create_dissector_handle( dissect_map_v5, proto_docsis_map_v5 ));
10586   dissector_add_uint ("docsis_mgmt", MGT_RNG_REQ, create_dissector_handle( dissect_rngreq, proto_docsis_rngreq ));
10587   dissector_add_uint ("docsis_mgmt", MGT_RNG_RSP, create_dissector_handle( dissect_rngrsp, proto_docsis_rngrsp ));
10588   dissector_add_uint ("docsis_mgmt", MGT_REG_REQ, create_dissector_handle( dissect_regreq, proto_docsis_regreq ));
10589   dissector_add_uint ("docsis_mgmt", MGT_REG_RSP, create_dissector_handle( dissect_regrsp, proto_docsis_regrsp ));
10590   dissector_add_uint ("docsis_mgmt", MGT_UCC_REQ, create_dissector_handle( dissect_uccreq, proto_docsis_uccreq ));
10591   dissector_add_uint ("docsis_mgmt", MGT_UCC_RSP, create_dissector_handle( dissect_uccrsp, proto_docsis_uccrsp ));
10592   dissector_add_uint ("docsis_mgmt", MGT_BPKM_REQ, create_dissector_handle( dissect_bpkmreq, proto_docsis_bpkmreq ));
10593   dissector_add_uint ("docsis_mgmt", MGT_BPKM_RSP, create_dissector_handle( dissect_bpkmrsp, proto_docsis_bpkmrsp ));
10594   dissector_add_uint ("docsis_mgmt", MGT_REG_ACK, create_dissector_handle( dissect_regack, proto_docsis_regack ));
10595   dissector_add_uint ("docsis_mgmt", MGT_DSA_REQ, create_dissector_handle( dissect_dsareq, proto_docsis_dsareq ));
10596   dissector_add_uint ("docsis_mgmt", MGT_DSA_RSP, create_dissector_handle( dissect_dsarsp, proto_docsis_dsarsp ));
10597   dissector_add_uint ("docsis_mgmt", MGT_DSA_ACK, create_dissector_handle( dissect_dsaack, proto_docsis_dsaack ));
10598   dissector_add_uint ("docsis_mgmt", MGT_DSC_REQ, create_dissector_handle( dissect_dscreq, proto_docsis_dscreq ));
10599   dissector_add_uint ("docsis_mgmt", MGT_DSC_RSP, create_dissector_handle( dissect_dscrsp, proto_docsis_dscrsp ));
10600   dissector_add_uint ("docsis_mgmt", MGT_DSC_ACK, create_dissector_handle( dissect_dscack, proto_docsis_dscack ));
10601   dissector_add_uint ("docsis_mgmt", MGT_DSD_REQ, create_dissector_handle( dissect_dsdreq, proto_docsis_dsdreq ));
10602   dissector_add_uint ("docsis_mgmt", MGT_DSD_RSP, create_dissector_handle( dissect_dsdrsp, proto_docsis_dsdrsp ));
10603   dissector_add_uint ("docsis_mgmt", MGT_DCC_REQ, create_dissector_handle( dissect_dccreq, proto_docsis_dccreq ));
10604   dissector_add_uint ("docsis_mgmt", MGT_DCC_RSP, create_dissector_handle( dissect_dccrsp, proto_docsis_dccrsp ));
10605   dissector_add_uint ("docsis_mgmt", MGT_DCC_ACK, create_dissector_handle( dissect_dccack, proto_docsis_dccack ));
10606   dissector_add_uint ("docsis_mgmt", MGT_TYPE29UCD, create_dissector_handle( dissect_type29ucd, proto_docsis_type29ucd ));
10607   dissector_add_uint ("docsis_mgmt", MGT_INIT_RNG_REQ, create_dissector_handle( dissect_intrngreq, proto_docsis_intrngreq ));
10608   dissector_add_uint ("docsis_mgmt", MGT_DS_CH_DESC, create_dissector_handle( dissect_dcd, proto_docsis_dcd ));
10609   dissector_add_uint ("docsis_mgmt", MGT_MDD, create_dissector_handle( dissect_mdd, proto_docsis_mdd ));
10610   dissector_add_uint ("docsis_mgmt", MGT_B_INIT_RNG_REQ, create_dissector_handle( dissect_bintrngreq, proto_docsis_bintrngreq ));
10611   dissector_add_uint ("docsis_mgmt", MGT_TYPE35UCD, create_dissector_handle( dissect_type35ucd, proto_docsis_type35ucd ));
10612   dissector_add_uint ("docsis_mgmt", MGT_DBC_REQ, create_dissector_handle( dissect_dbcreq, proto_docsis_dbcreq ));
10613   dissector_add_uint ("docsis_mgmt", MGT_DBC_RSP, create_dissector_handle( dissect_dbcrsp, proto_docsis_dbcrsp ));
10614   dissector_add_uint ("docsis_mgmt", MGT_DBC_ACK, create_dissector_handle( dissect_dbcack, proto_docsis_dbcack ));
10615   dissector_add_uint ("docsis_mgmt", MGT_DPV_REQ, create_dissector_handle( dissect_dpvreq, proto_docsis_dpvreq ));
10616   dissector_add_uint ("docsis_mgmt", MGT_DPV_RSP, create_dissector_handle( dissect_dpvrsp, proto_docsis_dpvrsp ));
10617   dissector_add_uint ("docsis_mgmt", MGT_CM_STATUS, create_dissector_handle( dissect_cmstatus, proto_docsis_cmstatus ));
10618   dissector_add_uint ("docsis_mgmt", MGT_CM_STATUS_ACK, create_dissector_handle( dissect_cmstatusack, proto_docsis_cmstatusack ));
10619   dissector_add_uint ("docsis_mgmt", MGT_CM_CTRL_REQ, create_dissector_handle( dissect_cmctrlreq, proto_docsis_cmctrlreq ));
10620   dissector_add_uint ("docsis_mgmt", MGT_CM_CTRL_RSP, create_dissector_handle( dissect_cmctrlrsp, proto_docsis_cmctrlrsp ));
10621   dissector_add_uint ("docsis_mgmt", MGT_REG_REQ_MP, create_dissector_handle( dissect_regreqmp, proto_docsis_regreqmp ));
10622   dissector_add_uint ("docsis_mgmt", MGT_REG_RSP_MP, create_dissector_handle( dissect_regrspmp, proto_docsis_regrspmp ));
10623   dissector_add_uint ("docsis_mgmt", MGT_EM_REQ, create_dissector_handle( dissect_emreq, proto_docsis_emreq ));
10624   dissector_add_uint ("docsis_mgmt", MGT_EM_RSP, create_dissector_handle( dissect_emrsp, proto_docsis_emrsp ));
10625   dissector_add_uint ("docsis_mgmt", MGT_OCD, create_dissector_handle( dissect_ocd, proto_docsis_ocd ));
10626   dissector_add_uint ("docsis_mgmt", MGT_DPD, create_dissector_handle( dissect_dpd, proto_docsis_dpd ));
10627   dissector_add_uint ("docsis_mgmt", MGT_TYPE51UCD, create_dissector_handle( dissect_type51ucd, proto_docsis_type51ucd ));
10628   dissector_add_uint ("docsis_mgmt", MGT_OPT_REQ, create_dissector_handle( dissect_optreq, proto_docsis_optreq ));
10629   dissector_add_uint ("docsis_mgmt", MGT_OPT_RSP, create_dissector_handle( dissect_optrsp, proto_docsis_optrsp ));
10630   dissector_add_uint ("docsis_mgmt", MGT_OPT_ACK, create_dissector_handle( dissect_optack, proto_docsis_optack ));
10631   dissector_add_uint ("docsis_mgmt", MGT_RBA_SW, create_dissector_handle( dissect_rba, proto_docsis_rba ));
10632 
10633   docsis_tlv_handle = find_dissector ("docsis_tlv");
10634 
10635   reassembly_table_register(&docsis_tlv_reassembly_table, &addresses_reassembly_table_functions);
10636   reassembly_table_register(&docsis_opt_tlv_reassembly_table, &addresses_reassembly_table_functions);
10637   reassembly_table_register(&docsis_rngrsp_tlv_reassembly_table, &addresses_reassembly_table_functions);
10638 
10639 }
10640 
10641 /*
10642  * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
10643  *
10644  * Local Variables:
10645  * c-basic-offset: 2
10646  * tab-width: 8
10647  * indent-tabs-mode: nil
10648  * End:
10649  *
10650  * ex: set shiftwidth=2 tabstop=8 expandtab:
10651  * :indentSize=2:tabSize=8:noTabs=true:
10652  */
10653