2 * Routines for UCD Message dissection
3 * Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 #include <epan/packet.h>
29 #include <epan/exceptions.h>
31 #define UCD_SYMBOL_RATE 1
32 #define UCD_FREQUENCY 2
33 #define UCD_PREAMBLE 3
34 #define UCD_BURST_DESCR 4
35 #define UCD_BURST_DESCR5 5
37 #define UCD_MODULATION 1
38 #define UCD_DIFF_ENCODING 2
39 #define UCD_PREAMBLE_LEN 3
40 #define UCD_PREAMBLE_VAL_OFF 4
42 #define UCD_FEC_CODEWORD 6
43 #define UCD_SCRAMBLER_SEED 7
44 #define UCD_MAX_BURST 8
45 #define UCD_GUARD_TIME 9
46 #define UCD_LAST_CW_LEN 10
47 #define UCD_SCRAMBLER_ONOFF 11
48 #define UCD_RS_INT_DEPTH 12
49 #define UCD_RS_INT_BLOCK 13
50 #define UCD_PREAMBLE_TYPE 14
51 #define UCD_SCMDA_SCRAMBLER_ONOFF 15
52 #define UCD_SCDMA_CODES_PER_SUBFRAME 16
53 #define UCD_SCDMA_FRAMER_INT_STEP_SIZE 17
54 #define UCD_TCM_ENABLED 18
57 #define IUC_REQ_DATA 2
58 #define IUC_INIT_MAINT 3
59 #define IUC_STATION_MAINT 4
60 #define IUC_SHORT_DATA_GRANT 5
61 #define IUC_LONG_DATA_GRANT 6
63 #define IUC_DATA_ACK 8
64 #define IUC_ADV_PHY_SHORT_DATA_GRANT 9
65 #define IUC_ADV_PHY_LONG_DATA_GRANT 10
66 #define IUC_ADV_PHY_UGS 11
67 #define IUC_RESERVED12 12
68 #define IUC_RESERVED13 13
69 #define IUC_RESERVED14 14
70 #define IUC_EXPANSION 15
72 void proto_register_docsis_ucd(void);
73 void proto_reg_handoff_docsis_ucd(void);
75 /* Initialize the protocol and registered fields */
76 static int proto_docsis_ucd = -1;
78 static int hf_docsis_ucd_upstream_chid = -1;
79 static int hf_docsis_ucd_config_ch_cnt = -1;
80 static int hf_docsis_ucd_mini_slot_size = -1;
81 static int hf_docsis_ucd_down_chid = -1;
82 static int hf_docsis_ucd_type = -1;
83 static int hf_docsis_ucd_length = -1;
84 static int hf_docsis_ucd_symbol_rate = -1;
85 static int hf_docsis_ucd_frequency = -1;
86 static int hf_docsis_ucd_preamble_pat = -1;
87 static int hf_docsis_ucd_iuc = -1;
89 static int hf_docsis_burst_mod_type = -1;
90 static int hf_docsis_burst_diff_encoding = -1;
91 static int hf_docsis_burst_preamble_len = -1;
92 static int hf_docsis_burst_preamble_val_off = -1;
93 static int hf_docsis_burst_fec = -1;
94 static int hf_docsis_burst_fec_codeword = -1;
95 static int hf_docsis_burst_scrambler_seed = -1;
96 static int hf_docsis_burst_max_burst = -1;
97 static int hf_docsis_burst_guard_time = -1;
98 static int hf_docsis_burst_last_cw_len = -1;
99 static int hf_docsis_burst_scrambler_onoff = -1;
100 static int hf_docsis_rs_int_depth = -1;
101 static int hf_docsis_rs_int_block = -1;
102 static int hf_docsis_preamble_type = -1;
103 static int hf_docsis_scdma_scrambler_onoff = -1;
104 static int hf_docsis_scdma_codes_per_subframe = -1;
105 static int hf_docsis_scdma_framer_int_step_size = -1;
106 static int hf_docsis_tcm_enabled = -1;
108 /* Initialize the subtree pointers */
109 static gint ett_docsis_ucd = -1;
110 static gint ett_tlv = -1;
112 static const value_string channel_tlv_vals[] = {
113 {UCD_SYMBOL_RATE, "Symbol Rate"},
114 {UCD_FREQUENCY, "Frequency"},
115 {UCD_PREAMBLE, "Preamble Pattern"},
116 {UCD_BURST_DESCR, "Burst Descriptor"},
117 {UCD_BURST_DESCR5, "Burst Descriptor DOCSIS 2.0"},
121 static const value_string on_off_vals[] = {
127 static const value_string mod_vals[] = {
133 value_string iuc_vals[] = {
134 {IUC_REQUEST, "Request"},
135 {IUC_REQ_DATA, "REQ/Data"},
136 {IUC_INIT_MAINT, "Initial Maintenance"},
137 {IUC_STATION_MAINT, "Station Maintenance"},
138 {IUC_SHORT_DATA_GRANT, "Short Data Grant"},
139 {IUC_LONG_DATA_GRANT, "Long Data Grant"},
140 {IUC_NULL_IE, "NULL IE"},
141 {IUC_DATA_ACK, "Data Ack"},
142 {IUC_ADV_PHY_SHORT_DATA_GRANT, "Advanced Phy Short Data Grant"},
143 {IUC_ADV_PHY_LONG_DATA_GRANT, "Advanced Phy Long Data Grant"},
144 {IUC_ADV_PHY_UGS, "Advanced Phy UGS"},
145 {IUC_RESERVED12, "Reserved"},
146 {IUC_RESERVED13, "Reserved"},
147 {IUC_RESERVED14, "Reserved"},
148 {IUC_EXPANSION, "Expanded IUC"},
153 static const value_string last_cw_len_vals[] = {
158 /* Code to actually dissect the packets */
160 dissect_ucd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
164 guint8 tlvlen, tlvtype;
165 proto_tree *ucd_tree;
166 proto_item *ucd_item;
167 proto_tree *tlv_tree;
168 proto_item *tlv_item;
170 guint8 upchid, symrate;
172 len = tvb_reported_length_remaining (tvb, 0);
173 upchid = tvb_get_guint8 (tvb, 0);
175 /* if the upstream Channel ID is 0 then this is for Telephony Return) */
177 col_add_fstr (pinfo->cinfo, COL_INFO,
178 "UCD Message: Channel ID = %u (U%u)", upchid,
181 col_add_fstr (pinfo->cinfo, COL_INFO,
182 "UCD Message: Channel ID = %u (Telephony Return)",
188 proto_tree_add_protocol_format (tree, proto_docsis_ucd, tvb, 0, -1,
190 ucd_tree = proto_item_add_subtree (ucd_item, ett_docsis_ucd);
191 proto_tree_add_item (ucd_tree, hf_docsis_ucd_upstream_chid, tvb, 0, 1,
193 proto_tree_add_item (ucd_tree, hf_docsis_ucd_config_ch_cnt, tvb, 1, 1,
195 proto_tree_add_item (ucd_tree, hf_docsis_ucd_mini_slot_size, tvb, 2, 1,
197 proto_tree_add_item (ucd_tree, hf_docsis_ucd_down_chid, tvb, 3, 1,
203 type = tvb_get_guint8 (tvb, pos);
204 tlv_item = proto_tree_add_text (ucd_tree, tvb, pos, -1,
206 val_to_str(type, channel_tlv_vals,
207 "Unknown TLV (%u)"));
208 tlv_tree = proto_item_add_subtree (tlv_item, ett_tlv);
209 proto_tree_add_uint (tlv_tree, hf_docsis_ucd_type,
212 length = tvb_get_guint8 (tvb, pos);
213 proto_tree_add_uint (tlv_tree, hf_docsis_ucd_length,
214 tvb, pos, 1, length);
216 proto_item_set_len(tlv_item, length + 2);
219 case UCD_SYMBOL_RATE:
222 symrate = tvb_get_guint8 (tvb, pos);
223 proto_tree_add_uint (tlv_tree, hf_docsis_ucd_symbol_rate,
224 tvb, pos, length, symrate * 160);
228 THROW (ReportedBoundsError);
235 proto_tree_add_item (tlv_tree, hf_docsis_ucd_frequency, tvb,
236 pos, length, ENC_BIG_ENDIAN);
241 THROW (ReportedBoundsError);
245 proto_tree_add_item (tlv_tree, hf_docsis_ucd_preamble_pat, tvb,
246 pos, length, ENC_NA);
249 case UCD_BURST_DESCR:
250 proto_tree_add_item (tlv_tree, hf_docsis_ucd_iuc, tvb,
251 pos++, 1, ENC_BIG_ENDIAN);
252 endtlvpos = pos + length - 1;
253 while (pos < endtlvpos)
255 tlvtype = tvb_get_guint8 (tvb, pos++);
256 tlvlen = tvb_get_guint8 (tvb, pos++);
262 proto_tree_add_item (tlv_tree,
263 hf_docsis_burst_mod_type, tvb,
264 pos, tlvlen, ENC_BIG_ENDIAN);
268 THROW (ReportedBoundsError);
271 case UCD_DIFF_ENCODING:
274 proto_tree_add_item (tlv_tree,
275 hf_docsis_burst_diff_encoding,
276 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
280 THROW (ReportedBoundsError);
283 case UCD_PREAMBLE_LEN:
286 proto_tree_add_item (tlv_tree,
287 hf_docsis_burst_preamble_len,
288 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
292 THROW (ReportedBoundsError);
295 case UCD_PREAMBLE_VAL_OFF:
298 proto_tree_add_item (tlv_tree,
299 hf_docsis_burst_preamble_val_off,
300 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
304 THROW (ReportedBoundsError);
310 proto_tree_add_item (tlv_tree,
311 hf_docsis_burst_fec, tvb, pos,
312 tlvlen, ENC_BIG_ENDIAN);
316 THROW (ReportedBoundsError);
319 case UCD_FEC_CODEWORD:
322 proto_tree_add_item (tlv_tree,
323 hf_docsis_burst_fec_codeword,
324 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
328 THROW (ReportedBoundsError);
331 case UCD_SCRAMBLER_SEED:
334 proto_tree_add_item (tlv_tree,
335 hf_docsis_burst_scrambler_seed,
336 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
340 THROW (ReportedBoundsError);
346 proto_tree_add_item (tlv_tree,
347 hf_docsis_burst_max_burst, tvb,
348 pos, tlvlen, ENC_BIG_ENDIAN);
352 THROW (ReportedBoundsError);
358 proto_tree_add_item (tlv_tree,
359 hf_docsis_burst_guard_time,
360 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
364 THROW (ReportedBoundsError);
367 case UCD_LAST_CW_LEN:
370 proto_tree_add_item (tlv_tree,
371 hf_docsis_burst_last_cw_len,
372 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
376 THROW (ReportedBoundsError);
379 case UCD_SCRAMBLER_ONOFF:
382 proto_tree_add_item (tlv_tree,
383 hf_docsis_burst_scrambler_onoff,
384 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
388 THROW (ReportedBoundsError);
391 } /* switch(tlvtype) */
393 } /* while (pos < endtlvpos) */
395 case UCD_BURST_DESCR5:
396 /* DOCSIS 2.0 Upstream Channel Descriptor */
397 proto_tree_add_item (tlv_tree, hf_docsis_ucd_iuc, tvb,
398 pos++, 1, ENC_BIG_ENDIAN);
399 endtlvpos = pos + length - 1;
400 while (pos < endtlvpos)
402 tlvtype = tvb_get_guint8 (tvb, pos++);
403 tlvlen = tvb_get_guint8 (tvb, pos++);
409 proto_tree_add_item (tlv_tree,
410 hf_docsis_burst_mod_type, tvb,
411 pos, tlvlen, ENC_BIG_ENDIAN);
415 THROW (ReportedBoundsError);
418 case UCD_DIFF_ENCODING:
421 proto_tree_add_item (tlv_tree,
422 hf_docsis_burst_diff_encoding,
423 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
427 THROW (ReportedBoundsError);
430 case UCD_PREAMBLE_LEN:
433 proto_tree_add_item (tlv_tree,
434 hf_docsis_burst_preamble_len,
435 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
439 THROW (ReportedBoundsError);
442 case UCD_PREAMBLE_VAL_OFF:
445 proto_tree_add_item (tlv_tree,
446 hf_docsis_burst_preamble_val_off,
447 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
451 THROW (ReportedBoundsError);
457 proto_tree_add_item (tlv_tree,
458 hf_docsis_burst_fec, tvb, pos,
459 tlvlen, ENC_BIG_ENDIAN);
463 THROW (ReportedBoundsError);
466 case UCD_FEC_CODEWORD:
469 proto_tree_add_item (tlv_tree,
470 hf_docsis_burst_fec_codeword,
471 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
475 THROW (ReportedBoundsError);
478 case UCD_SCRAMBLER_SEED:
481 proto_tree_add_item (tlv_tree,
482 hf_docsis_burst_scrambler_seed,
483 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
487 THROW (ReportedBoundsError);
493 proto_tree_add_item (tlv_tree,
494 hf_docsis_burst_max_burst, tvb,
495 pos, tlvlen, ENC_BIG_ENDIAN);
499 THROW (ReportedBoundsError);
505 proto_tree_add_item (tlv_tree,
506 hf_docsis_burst_guard_time,
507 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
511 THROW (ReportedBoundsError);
514 case UCD_LAST_CW_LEN:
517 proto_tree_add_item (tlv_tree,
518 hf_docsis_burst_last_cw_len,
519 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
523 THROW (ReportedBoundsError);
526 case UCD_SCRAMBLER_ONOFF:
529 proto_tree_add_item (tlv_tree,
530 hf_docsis_burst_scrambler_onoff,
531 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
535 THROW (ReportedBoundsError);
538 /* New cases added for DOCSIS 2.0 US Physical Burst Descriptor TLV */
539 /* #define UCD_RS_INT_DEPTH 12
540 * * #define UCD_RS_INT_BLOCK 13
541 * * #define UCD_PREAMBLE_TYPE 14
542 * * #define UCD_SCMDA_SCRAMBLER_ONOFF 15
543 * * #define UCD_SCDMA_CODES_PER_SUBFRAME 16
544 * * #define UCD_SCDMA_FRAMER_INT_STEP_SIZE 17
545 * * #define UCD_TCM_ENABLED 18
547 case UCD_RS_INT_DEPTH:
550 proto_tree_add_item (tlv_tree,
551 hf_docsis_rs_int_depth,
552 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
556 THROW (ReportedBoundsError);
559 case UCD_RS_INT_BLOCK:
562 proto_tree_add_item (tlv_tree,
563 hf_docsis_rs_int_block,
564 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
568 THROW (ReportedBoundsError);
571 case UCD_PREAMBLE_TYPE:
574 proto_tree_add_item (tlv_tree,
575 hf_docsis_preamble_type,
576 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
580 THROW (ReportedBoundsError);
583 case UCD_SCMDA_SCRAMBLER_ONOFF:
586 proto_tree_add_item (tlv_tree,
587 hf_docsis_scdma_scrambler_onoff,
588 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
592 THROW (ReportedBoundsError);
595 case UCD_SCDMA_CODES_PER_SUBFRAME:
598 proto_tree_add_item (tlv_tree,
599 hf_docsis_scdma_codes_per_subframe,
600 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
604 THROW (ReportedBoundsError);
607 case UCD_SCDMA_FRAMER_INT_STEP_SIZE:
610 proto_tree_add_item (tlv_tree,
611 hf_docsis_scdma_framer_int_step_size,
612 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
616 THROW (ReportedBoundsError);
619 case UCD_TCM_ENABLED:
622 proto_tree_add_item (tlv_tree,
623 hf_docsis_tcm_enabled,
624 tvb, pos, tlvlen, ENC_BIG_ENDIAN);
628 THROW (ReportedBoundsError);
631 } /* switch(tlvtype) */
633 } /* while (pos < endtlvpos) */
636 } /* while (pos < len) */
641 /* Register the protocol with Wireshark */
643 /* this format is require because a script is used to build the C function
644 that calls all the protocol registration.
649 proto_register_docsis_ucd (void)
652 /* Setup list of header fields See Section 1.6.1 for details*/
653 static hf_register_info hf[] = {
654 {&hf_docsis_ucd_upstream_chid,
655 {"Upstream Channel ID", "docsis_ucd.upchid",
656 FT_UINT8, BASE_DEC, NULL, 0x0,
659 {&hf_docsis_ucd_config_ch_cnt,
660 {"Config Change Count", "docsis_ucd.confcngcnt",
661 FT_UINT8, BASE_DEC, NULL, 0x0,
662 "Configuration Change Count", HFILL}
664 {&hf_docsis_ucd_mini_slot_size,
665 {"Mini Slot Size (6.25us TimeTicks)", "docsis_ucd.mslotsize",
666 FT_UINT8, BASE_DEC, NULL, 0x0,
669 {&hf_docsis_ucd_down_chid,
670 {"Downstream Channel ID", "docsis_ucd.downchid",
671 FT_UINT8, BASE_DEC, NULL, 0x0,
672 "Management Message", HFILL}
674 {&hf_docsis_ucd_type,
675 {"TLV Type", "docsis_ucd.type",
676 FT_UINT8, BASE_DEC, VALS(channel_tlv_vals), 0x0,
677 "Channel TLV type", HFILL}
679 {&hf_docsis_ucd_length,
680 {"TLV Length", "docsis_ucd.length",
681 FT_UINT8, BASE_DEC, NULL, 0x0,
682 "Channel TLV length", HFILL}
684 {&hf_docsis_ucd_symbol_rate,
685 {"Symbol Rate (ksym/sec)", "docsis_ucd.symrate",
686 FT_UINT8, BASE_DEC, NULL, 0x0,
687 "Symbol Rate", HFILL}
689 {&hf_docsis_ucd_frequency,
690 {"Frequency (Hz)", "docsis_ucd.freq",
691 FT_UINT32, BASE_DEC, NULL, 0x0,
692 "Upstream Center Frequency", HFILL}
694 {&hf_docsis_ucd_preamble_pat,
695 {"Preamble Pattern", "docsis_ucd.preamble",
696 FT_BYTES, BASE_NONE, NULL, 0x0,
697 "Preamble Superstring", HFILL}
700 {"Interval Usage Code", "docsis_ucd.iuc",
701 FT_UINT8, BASE_DEC, VALS (iuc_vals), 0x0,
704 {&hf_docsis_burst_mod_type,
705 {"1 Modulation Type", "docsis_ucd.burst.modtype",
706 FT_UINT8, BASE_DEC, VALS (mod_vals), 0x0,
707 "Modulation Type", HFILL}
709 {&hf_docsis_burst_diff_encoding,
710 {"2 Differential Encoding", "docsis_ucd.burst.diffenc",
711 FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
712 "Differential Encoding", HFILL}
714 {&hf_docsis_burst_preamble_len,
715 {"3 Preamble Length (Bits)", "docsis_ucd.burst.preamble_len",
716 FT_UINT16, BASE_DEC, NULL, 0x0,
717 "Preamble Length (Bits)", HFILL}
719 {&hf_docsis_burst_preamble_val_off,
720 {"4 Preamble Offset (Bits)", "docsis_ucd.burst.preamble_off",
721 FT_UINT16, BASE_DEC, NULL, 0x0,
722 "Preamble Offset (Bits)", HFILL}
724 {&hf_docsis_burst_fec,
725 {"5 FEC (T)", "docsis_ucd.burst.fec",
726 FT_UINT8, BASE_DEC, NULL, 0x0,
727 "FEC (T) Codeword Parity Bits = 2^T", HFILL}
729 {&hf_docsis_burst_fec_codeword,
730 {"6 FEC Codeword Info bytes (k)", "docsis_ucd.burst.fec_codeword",
731 FT_UINT8, BASE_DEC, NULL, 0x0,
732 "FEC Codeword Info Bytes (k)", HFILL}
734 {&hf_docsis_burst_scrambler_seed,
735 {"7 Scrambler Seed", "docsis_ucd.burst.scrambler_seed",
736 FT_UINT16, BASE_HEX, NULL, 0x0,
737 "Burst Descriptor", HFILL}
739 {&hf_docsis_burst_max_burst,
740 {"8 Max Burst Size (Minislots)", "docsis_ucd.burst.maxburst",
741 FT_UINT8, BASE_DEC, NULL, 0x0,
742 "Max Burst Size (Minislots)", HFILL}
744 {&hf_docsis_burst_guard_time,
745 {"9 Guard Time Size (Symbol Times)", "docsis_ucd.burst.guardtime",
746 FT_UINT8, BASE_DEC, NULL, 0x0,
747 "Guard Time Size", HFILL}
749 {&hf_docsis_burst_last_cw_len,
750 {"10 Last Codeword Length", "docsis_ucd.burst.last_cw_len",
751 FT_UINT8, BASE_DEC, VALS (last_cw_len_vals), 0x0,
752 "Last Codeword Length", HFILL}
754 {&hf_docsis_burst_scrambler_onoff,
755 {"11 Scrambler On/Off", "docsis_ucd.burst.scrambleronoff",
756 FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
757 "Scrambler On/Off", HFILL}
759 {&hf_docsis_rs_int_depth,
760 {"12 RS Interleaver Depth", "docsis_ucd.burst.rsintdepth",
761 FT_UINT8, BASE_DEC, NULL, 0x0,
762 "R-S Interleaver Depth", HFILL}
764 {&hf_docsis_rs_int_block,
765 {"13 RS Interleaver Block Size", "docsis_ucd.burst.rsintblock",
766 FT_UINT8, BASE_DEC, NULL, 0x0,
767 "R-S Interleaver Block", HFILL}
769 {&hf_docsis_preamble_type,
770 {"14 Preamble Type", "docsis_ucd.burst.preambletype",
771 FT_UINT8, BASE_DEC, NULL, 0x0,
772 "Preamble Type", HFILL}
774 {&hf_docsis_scdma_scrambler_onoff,
775 {"15 SCDMA Scrambler On/Off", "docsis_ucd.burst.scdmascrambleronoff",
776 FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
777 "SCDMA Scrambler On/Off", HFILL}
779 {&hf_docsis_scdma_codes_per_subframe,
780 {"16 SCDMA Codes per Subframe", "docsis_ucd.burst.scdmacodespersubframe",
781 FT_UINT8, BASE_DEC, NULL, 0x0,
782 "SCDMA Codes per Subframe", HFILL}
784 {&hf_docsis_scdma_framer_int_step_size,
785 {"17 SDMA Framer Int Step Size", "docsis_ucd.burst.scdmaframerintstepsize",
786 FT_UINT8, BASE_DEC, NULL, 0x0,
787 "SCDMA Framer Interleaving Step Size", HFILL}
789 {&hf_docsis_tcm_enabled,
790 {"18 TCM Enable", "docsis_ucd.burst.tcmenabled",
791 FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
792 "TCM Enabled", HFILL}
796 /* Setup protocol subtree array */
797 static gint *ett[] = {
802 /* Register the protocol name and description */
804 proto_register_protocol ("DOCSIS Upstream Channel Descriptor",
805 "DOCSIS UCD", "docsis_ucd");
807 /* Required function calls to register the header fields and subtrees used */
808 proto_register_field_array (proto_docsis_ucd, hf, array_length (hf));
809 proto_register_subtree_array (ett, array_length (ett));
811 register_dissector ("docsis_ucd", dissect_ucd, proto_docsis_ucd);
815 /* If this dissector uses sub-dissector registration add a registration routine.
816 This format is required because a script is used to find these routines and
817 create the code that calls these routines.
820 proto_reg_handoff_docsis_ucd (void)
822 dissector_handle_t docsis_ucd_handle;
824 docsis_ucd_handle = find_dissector ("docsis_ucd");
825 dissector_add_uint ("docsis_mgmt", 0x02, docsis_ucd_handle);