From Brian Wheeler: DOCSIS 2.0 support.

svn path=/trunk/; revision=10387
This commit is contained in:
Guy Harris 2004-03-17 06:55:03 +00:00
parent 3c0839b99b
commit 2b9ad9ec25
13 changed files with 1848 additions and 295 deletions

View File

@ -2055,6 +2055,10 @@ metatech <metatech [AT] flashmail.com> {
IBM WebSphere MQ protocol support
}
Brian Wheeler <Brian.Wheeler [AT] arrisi.com> {
DOCSIS 2.0 support
}
And assorted fixes and enhancements by the people listed above and by:
Pavel Roskin <proski [AT] gnu.org>

View File

@ -2121,6 +2121,7 @@ B<http://www.ethereal.com>.
John Engelhart <johne [AT] zang.com>
Ryuji Somegawa <ryuji-so [AT] is.aist-nara.ac.jp>
metatech <metatech [AT] flashmail.com>
Brian Wheeler <Brian.Wheeler [AT] arrisi.com>
Pavel Roskin <proski [AT] gnu.org>
Georgi Guninski <guninski [AT] guninski.com>
Jason Copenhaver <jcopenha [AT] typedef.org>

View File

@ -1,3 +1,3 @@
Author :
Anand Narwani <anand[AT]narwani.org>
Brian Wheeler <brian.wheeler[AT]arrisi.com>

View File

@ -1,7 +1,7 @@
# Makefile.am
# Automake file for Ethereal/docsis subdissectors
#
# $Id: Makefile.am,v 1.5 2003/09/05 07:44:45 jmayer Exp $
# $Id: Makefile.am,v 1.6 2004/03/17 06:55:02 guy Exp $
#
# Ethereal - Network traffic analyzer
# By Gerald Combs <gerald@ethereal.com>
@ -27,7 +27,7 @@ INCLUDES = -I$(top_srcdir) -I$(includedir)
plugindir = @plugindir@
plugin_LTLIBRARIES = docsis.la
docsis_la_SOURCES = packet-docsis.c packet-bpkmattr.c packet-dsarsp.c packet-macmgmt.c packet-rngrsp.c packet-bpkmreq.c packet-dscack.c packet-map.c packet-tlv.c packet-bpkmrsp.c packet-dscreq.c packet-regack.c packet-uccreq.c packet-dscrsp.c packet-regreq.c packet-uccrsp.c packet-dsaack.c packet-dsdreq.c packet-regrsp.c packet-ucd.c packet-dsareq.c packet-dsdrsp.c packet-rngreq.c packet-vendor.c packet-docsis.h packet-tlv.h moduleinfo.h
docsis_la_SOURCES = packet-intrngreq.c packet-type29ucd.c packet-docsis.c packet-bpkmattr.c packet-dsarsp.c packet-macmgmt.c packet-rngrsp.c packet-bpkmreq.c packet-dscack.c packet-map.c packet-tlv.c packet-bpkmrsp.c packet-dscreq.c packet-regack.c packet-uccreq.c packet-dscrsp.c packet-regreq.c packet-uccrsp.c packet-dsaack.c packet-dsdreq.c packet-regrsp.c packet-ucd.c packet-dsareq.c packet-dsdrsp.c packet-rngreq.c packet-vendor.c packet-docsis.h packet-tlv.h moduleinfo.h
docsis_la_LDFLAGS = -module -avoid-version
# Libs must be cleared, or else libtool won't create a shared module.

View File

@ -1,5 +1,5 @@
#
# $Id: Makefile.nmake,v 1.7 2003/11/06 09:05:12 guy Exp $
# $Id: Makefile.nmake,v 1.8 2004/03/17 06:55:02 guy Exp $
#
include ..\..\config.nmake
@ -9,7 +9,8 @@ include ..\..\config.nmake
CFLAGS=/DHAVE_CONFIG_H /I../.. /I../../wiretap $(GLIB_CFLAGS) \
/I$(PCAP_DIR)\include -D_U_="" $(LOCAL_CFLAGS)
OBJECTS=packet-docsis.obj packet-bpkmattr.obj \
OBJECTS=packet-intrngreq.obj packet-type29ucd.obj \
packet-docsis.obj packet-bpkmattr.obj \
packet-dsarsp.obj packet-macmgmt.obj \
packet-rngrsp.obj packet-bpkmreq.obj \
packet-dscack.obj packet-map.obj \

View File

@ -4,7 +4,8 @@ Overview:
The dissectors provided by this plugin allow the dissection of DOCSIS 1.1
Frames. Captures of DOCSIS 1.1 frames can be facilitated using Cisco's
Cable Monitor Features found on Cicso UBR7200 and UBR10000 Series Cable Modem
Termination Systems.
Termination Systems. Captures of DOCSIS 1.1 and DOCSIS 2.0 frames can be
facilitated using the ARRIS Cadant C4 and the ARRIS Cadant C3.
Features:
@ -35,12 +36,17 @@ Features:
BPKM Attributes
+ Decode All Appendix C TLV's
+ Decode Concatenated Frames via a recursive call to dissect_docsis()
+ Decode DOCSIS 2.0 packets including:
Type 29 UCD Messages (DOCSIS 2.0 only)
INT-RNG-REQ
References:
===========
DOCSIS 1.1 Specifications can be found at:
DOCSIS 1.1 and DOCSIS 2.0 Specifications can be found at:
http://www.cablemodem.com/specifications.html
Information on Cisco's Cable Monitor Feature can be found at:
http://www.cisco.com/univercd/cc/td/doc/product/cable/cab_rout/cmtsfg/ufg_cmon.htm
Information on the ARRIS Cadant line of products
http://www.arrisi.com/products_solutions/product_families/Cadant/index.asp

View File

@ -2,7 +2,7 @@
* Routines for docsis dissection
* Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
*
* $Id: packet-docsis.c,v 1.18 2004/02/05 08:16:01 guy Exp $
* $Id: packet-docsis.c,v 1.19 2004/03/17 06:55:03 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -796,9 +796,12 @@ plugin_reg_handoff (void)
proto_reg_handoff_docsis_dsdreq ();
proto_reg_handoff_docsis_regrsp ();
proto_reg_handoff_docsis_ucd ();
proto_reg_handoff_docsis_type29ucd ();
proto_reg_handoff_docsis_dsareq ();
proto_reg_handoff_docsis_dsdrsp ();
proto_reg_handoff_docsis_vsif ();
proto_reg_handoff_docsis_intrngreq ();
}
G_MODULE_EXPORT void
@ -833,10 +836,12 @@ plugin_init (plugin_address_table_t * pat
proto_register_docsis_dsdreq ();
proto_register_docsis_regrsp ();
proto_register_docsis_ucd ();
proto_register_docsis_type29ucd ();
proto_register_docsis_dsareq ();
proto_register_docsis_dsdrsp ();
proto_register_docsis_rngreq ();
proto_register_docsis_vsif ();
proto_register_docsis_intrngreq ();
}
}

View File

@ -1,6 +1,6 @@
/* packet-docsis.h
*
* $Id: packet-docsis.h,v 1.4 2002/09/10 19:07:38 guy Exp $
* $Id: packet-docsis.h,v 1.5 2004/03/17 06:55:03 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -47,7 +47,10 @@ void proto_reg_handoff_docsis_tlv (void);
void proto_reg_handoff_docsis_uccreq (void);
void proto_reg_handoff_docsis_uccrsp (void);
void proto_reg_handoff_docsis_ucd (void);
void proto_reg_handoff_docsis_type29ucd (void);
void proto_reg_handoff_docsis_vsif (void);
void proto_reg_handoff_docsis_intrngreq (void);
void proto_register_docsis_bpkmattr (void);
void proto_register_docsis_bpkmreq (void);
@ -72,6 +75,7 @@ void proto_register_docsis_tlv (void);
void proto_register_docsis_uccreq (void);
void proto_register_docsis_uccrsp (void);
void proto_register_docsis_ucd (void);
void proto_register_docsis_type29ucd (void);
void proto_register_docsis_vsif (void);
void proto_register_docsis_intrngreq (void);
#endif

View File

@ -0,0 +1,158 @@
/* packet-intrngreq.c
* Routines for Intial Ranging Request Message dissection
* Copyright 2003, Brian Wheeler <brian.wheeler[AT]arrisi.com>
*
* $Id: packet-intrngreq.c,v 1.1 2004/03/17 06:55:03 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "plugins/plugin_api.h"
#include "plugins/plugin_api_defs.h"
#include "moduleinfo.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gmodule.h>
#include <epan/packet.h>
/* Initialize the protocol and registered fields */
static int proto_docsis_intrngreq = -1;
static int hf_docsis_intrngreq = -1;
static int hf_docsis_intrngreq_down_chid = -1;
static int hf_docsis_intrngreq_sid = -1;
static int hf_docsis_intrngreq_up_chid = -1;
/* Initialize the subtree pointers */
static gint ett_docsis_intrngreq = -1;
/* Code to actually dissect the packets */
static void
dissect_intrngreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
proto_item *intrngreq_item;
proto_tree *intrngreq_tree;
guint16 sid;
sid = tvb_get_ntohs (tvb, 0);
if (check_col (pinfo->cinfo, COL_INFO))
{
col_clear (pinfo->cinfo, COL_INFO);
col_add_fstr (pinfo->cinfo, COL_INFO, "Ranging Request: SID = %u",sid);
}
if (tree)
{
intrngreq_item =
proto_tree_add_protocol_format (tree, proto_docsis_intrngreq, tvb, 0,
tvb_length_remaining (tvb, 0),
"Initial Ranging Request");
intrngreq_tree = proto_item_add_subtree (intrngreq_item, ett_docsis_intrngreq);
proto_tree_add_item (intrngreq_tree, hf_docsis_intrngreq_sid, tvb, 0, 2,
FALSE);
proto_tree_add_item (intrngreq_tree, hf_docsis_intrngreq_down_chid, tvb, 2, 1,
FALSE);
proto_tree_add_item (intrngreq_tree, hf_docsis_intrngreq_up_chid, tvb, 3,
1, FALSE);
}
}
/* Register the protocol with Ethereal */
/* this format is require because a script is used to build the C function
that calls all the protocol registration.
*/
void
proto_register_docsis_intrngreq (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_docsis_intrngreq,
{"RNG-REQ Message", "docsis.intrngreq",
FT_BYTES, BASE_HEX, NULL, 0x0,
"Ranging Request Message", HFILL}
},
{&hf_docsis_intrngreq_sid,
{"Service Identifier", "docsis.intrngreq.sid",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Service Identifier", HFILL}
},
{&hf_docsis_intrngreq_down_chid,
{"Downstream Channel ID", "docsis.intrngreq.downchid",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Downstream Channel ID", HFILL}
},
{&hf_docsis_intrngreq_up_chid,
{"Upstream Channel ID", "docsis.intrngreq.upchid",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Upstream Channel ID", HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_intrngreq,
};
/* Register the protocol name and description */
proto_docsis_intrngreq = proto_register_protocol ("DOCSIS Initial Ranging Message",
"DOCSIS INT-RNG-REQ",
"docsis_intrngreq");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_intrngreq, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_intrngreq", dissect_intrngreq, proto_docsis_intrngreq);
}
/* If this dissector uses sub-dissector registration add a registration routine.
This format is required because a script is used to find these routines and
create the code that calls these routines.
*/
void
proto_reg_handoff_docsis_intrngreq (void)
{
dissector_handle_t docsis_intrngreq_handle;
docsis_intrngreq_handle = find_dissector ("docsis_intrngreq");
dissector_add ("docsis_mgmt", 0x1E, docsis_intrngreq_handle);
}

View File

@ -2,7 +2,7 @@
* Routines for docsis Mac Management Header dissection
* Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
*
* $Id: packet-macmgmt.c,v 1.5 2003/05/28 14:52:52 gerald Exp $
* $Id: packet-macmgmt.c,v 1.6 2004/03/17 06:55:03 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -68,6 +68,7 @@
#define MGT_DCI_REQ 26
#define MGT_DCI_RSP 27
#define MGT_UP_DIS 28
#define MGT_TYPE29UCD 29
/* Initialize the protocol and registered fields */
@ -94,6 +95,7 @@ static gint ett_mgmt_pay = -1;
static const value_string mgmt_type_vals[] = {
{MGT_SYNC, "Timing Synchronisation"},
{MGT_UCD, "Upstream Channel Descriptor"},
{MGT_TYPE29UCD, "Upstream Channel Descriptor Type 29"},
{MGT_MAP, "Upstream Bandwidth Allocation"},
{MGT_RNG_REQ, "Ranging Request"},
{MGT_RNG_RSP, "Ranging Response"},

View File

@ -2,7 +2,7 @@
* Routines for Ranging Request Message dissection
* Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
*
* $Id: packet-rngreq.c,v 1.6 2003/12/13 03:18:38 guy Exp $
* $Id: packet-rngreq.c,v 1.7 2004/03/17 06:55:03 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -122,7 +122,7 @@ proto_register_docsis_rngreq (void)
"Downstream Channel ID", HFILL}
},
{&hf_docsis_rngreq_pend_compl,
{"Pending Till Complete (hundreths of a sec)", "docsis.rngreq.upchid",
{"Pending Till Complete", "docsis.rngreq.pendcomp",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Upstream Channel ID", HFILL}
},
@ -135,7 +135,7 @@ proto_register_docsis_rngreq (void)
};
/* Register the protocol name and description */
proto_docsis_rngreq = proto_register_protocol ("DOCSIS MAP Messages",
proto_docsis_rngreq = proto_register_protocol ("DOCSIS Range Request Message",
"DOCSIS RNG-REQ",
"docsis_rngreq");

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
* Routines for UCD Message dissection
* Copyright 2002, Anand V. Narwani <anand[AT]narwani.org>
*
* $Id: packet-ucd.c,v 1.7 2003/12/13 03:18:38 guy Exp $
* $Id: packet-ucd.c,v 1.8 2004/03/17 06:55:03 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -44,6 +44,7 @@
#define UCD_FREQUENCY 2
#define UCD_PREAMBLE 3
#define UCD_BURST_DESCR 4
#define UCD_BURST_DESCR5 5
#define UCD_MODULATION 1
#define UCD_DIFF_ENCODING 2
@ -56,6 +57,13 @@
#define UCD_GUARD_TIME 9
#define UCD_LAST_CW_LEN 10
#define UCD_SCRAMBLER_ONOFF 11
#define UCD_RS_INT_DEPTH 12
#define UCD_RS_INT_BLOCK 13
#define UCD_PREAMBLE_TYPE 14
#define UCD_SCMDA_SCRAMBLER_ONOFF 15
#define UCD_SCDMA_CODES_PER_SUBFRAME 16
#define UCD_SCDMA_FRAMER_INT_STEP_SIZE 17
#define UCD_TCM_ENABLED 18
#define IUC_REQUEST 1
#define IUC_REQ_DATA 2
@ -65,9 +73,9 @@
#define IUC_LONG_DATA_GRANT 6
#define IUC_NULL_IE 7
#define IUC_DATA_ACK 8
#define IUC_RESERVED9 9
#define IUC_RESERVED10 10
#define IUC_RESERVED11 11
#define IUC_ADV_PHY_SHORT_DATA_GRANT 9
#define IUC_ADV_PHY_LONG_DATA_GRANT 10
#define IUC_ADV_PHY_UGS 11
#define IUC_RESERVED12 12
#define IUC_RESERVED13 13
#define IUC_RESERVED14 14
@ -98,58 +106,67 @@ static int hf_docsis_burst_max_burst = -1;
static int hf_docsis_burst_guard_time = -1;
static int hf_docsis_burst_last_cw_len = -1;
static int hf_docsis_burst_scrambler_onoff = -1;
static int hf_docsis_rs_int_depth = -1;
static int hf_docsis_rs_int_block = -1;
static int hf_docsis_preamble_type = -1;
static int hf_docsis_scdma_scrambler_onoff = -1;
static int hf_docsis_scdma_codes_per_subframe = -1;
static int hf_docsis_scdma_framer_int_step_size = -1;
static int hf_docsis_tcm_enabled = -1;
/* Initialize the subtree pointers */
static gint ett_docsis_ucd = -1;
static gint ett_tlv = -1;
static const value_string channel_tlv_vals[] = {
{UCD_SYMBOL_RATE, "Symbol Rate"},
{UCD_FREQUENCY, "Frequency"},
{UCD_PREAMBLE, "Preamble Pattern"},
{UCD_BURST_DESCR, "Burst Descriptor"},
{0, NULL}
{UCD_SYMBOL_RATE, "Symbol Rate"},
{UCD_FREQUENCY, "Frequency"},
{UCD_PREAMBLE, "Preamble Pattern"},
{UCD_BURST_DESCR, "Burst Descriptor"},
{UCD_BURST_DESCR5, "Burst Descriptor DOCSIS 2.0"},
{0, NULL}
};
static const value_string on_off_vals[] = {
{1, "On"},
{2, "Off"},
{0, NULL}
{1, "On"},
{2, "Off"},
{0, NULL}
};
static const value_string mod_vals[] = {
{1, "QPSK"},
{2, "QAM16"},
{0, NULL}
{1, "QPSK"},
{2, "QAM16"},
{0, NULL}
};
value_string iuc_vals[] = {
{IUC_REQUEST, "Request"},
{IUC_REQ_DATA, "REQ/Data"},
{IUC_INIT_MAINT, "Initial Maintenance"},
{IUC_STATION_MAINT, "Station Maintenance"},
{IUC_SHORT_DATA_GRANT, "Short Data Grant"},
{IUC_LONG_DATA_GRANT, "Long Data Grant"},
{IUC_NULL_IE, "NULL IE"},
{IUC_DATA_ACK, "Data Ack"},
{IUC_RESERVED9, "Reserved"},
{IUC_RESERVED10, "Reserved"},
{IUC_RESERVED11, "Reserved"},
{IUC_RESERVED12, "Reserved"},
{IUC_RESERVED13, "Reserved"},
{IUC_RESERVED14, "Reserved"},
{IUC_EXPANSION, "Expanded IUC"},
{0, NULL}
{IUC_REQUEST, "Request"},
{IUC_REQ_DATA, "REQ/Data"},
{IUC_INIT_MAINT, "Initial Maintenance"},
{IUC_STATION_MAINT, "Station Maintenance"},
{IUC_SHORT_DATA_GRANT, "Short Data Grant"},
{IUC_LONG_DATA_GRANT, "Long Data Grant"},
{IUC_NULL_IE, "NULL IE"},
{IUC_DATA_ACK, "Data Ack"},
{IUC_ADV_PHY_SHORT_DATA_GRANT, "Advanced Phy Short Data Grant"},
{IUC_ADV_PHY_LONG_DATA_GRANT, "Advanced Phy Long Data Grant"},
{IUC_ADV_PHY_UGS, "Advanced Phy UGS"},
{IUC_RESERVED12, "Reserved"},
{IUC_RESERVED13, "Reserved"},
{IUC_RESERVED14, "Reserved"},
{IUC_EXPANSION, "Expanded IUC"},
{0, NULL}
};
static const value_string last_cw_len_vals[] = {
{1, "Fixed"},
{2, "Shortened"},
{0, NULL}
{1, "Fixed"},
{2, "Shortened"},
{0, NULL}
};
/* Code to actually dissect the packets */
static void
dissect_ucd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
dissect_ucd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
int pos, endtlvpos;
guint8 type, length;
@ -160,42 +177,42 @@ dissect_ucd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
proto_item *tlv_item;
gint len;
guint8 upchid, symrate;
len = tvb_reported_length_remaining (tvb, 0);
upchid = tvb_get_guint8 (tvb, 0);
/* if the upstream Channel ID is 0 then this is for Telephony Return) */
if (check_col (pinfo->cinfo, COL_INFO))
{
col_clear (pinfo->cinfo, COL_INFO);
if (upchid > 0)
col_add_fstr (pinfo->cinfo, COL_INFO,
"UCD Message: Channel ID = %u (U%u)", upchid,
upchid - 1);
else
col_add_fstr (pinfo->cinfo, COL_INFO,
"UCD Message: Channel ID = %u (Telephony Return)",
upchid);
}
if (tree)
{
ucd_item =
upchid = tvb_get_guint8 (tvb, 0);
/* if the upstream Channel ID is 0 then this is for Telephony Return) */
if (check_col (pinfo->cinfo, COL_INFO))
{
col_clear (pinfo->cinfo, COL_INFO);
if (upchid > 0)
col_add_fstr (pinfo->cinfo, COL_INFO,
"UCD Message: Channel ID = %u (U%u)", upchid,
upchid - 1);
else
col_add_fstr (pinfo->cinfo, COL_INFO,
"UCD Message: Channel ID = %u (Telephony Return)",
upchid);
}
if (tree)
{
ucd_item =
proto_tree_add_protocol_format (tree, proto_docsis_ucd, tvb, 0, -1,
"UCD Message");
ucd_tree = proto_item_add_subtree (ucd_item, ett_docsis_ucd);
proto_tree_add_item (ucd_tree, hf_docsis_ucd_upstream_chid, tvb, 0, 1,
FALSE);
proto_tree_add_item (ucd_tree, hf_docsis_ucd_config_ch_cnt, tvb, 1, 1,
FALSE);
proto_tree_add_item (ucd_tree, hf_docsis_ucd_mini_slot_size, tvb, 2, 1,
FALSE);
proto_tree_add_item (ucd_tree, hf_docsis_ucd_down_chid, tvb, 3, 1,
FALSE);
pos = 4;
while (pos < len)
{
ucd_tree = proto_item_add_subtree (ucd_item, ett_docsis_ucd);
proto_tree_add_item (ucd_tree, hf_docsis_ucd_upstream_chid, tvb, 0, 1,
FALSE);
proto_tree_add_item (ucd_tree, hf_docsis_ucd_config_ch_cnt, tvb, 1, 1,
FALSE);
proto_tree_add_item (ucd_tree, hf_docsis_ucd_mini_slot_size, tvb, 2, 1,
FALSE);
proto_tree_add_item (ucd_tree, hf_docsis_ucd_down_chid, tvb, 3, 1,
FALSE);
pos = 4;
while (pos < len)
{
type = tvb_get_guint8 (tvb, pos);
tlv_item = proto_tree_add_text (ucd_tree, tvb, pos, -1,
"%s",
@ -210,203 +227,443 @@ dissect_ucd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
tvb, pos, 1, length);
pos++;
proto_item_set_len(tlv_item, length + 2);
switch (type)
{
case UCD_SYMBOL_RATE:
if (length == 1)
{
symrate = tvb_get_guint8 (tvb, pos);
proto_tree_add_uint (tlv_tree, hf_docsis_ucd_symbol_rate,
tvb, pos, length, symrate * 160);
}
else
{
THROW (ReportedBoundsError);
}
pos = pos + length;
break;
case UCD_FREQUENCY:
if (length == 4)
{
proto_tree_add_item (tlv_tree, hf_docsis_ucd_frequency, tvb,
switch (type)
{
case UCD_SYMBOL_RATE:
if (length == 1)
{
symrate = tvb_get_guint8 (tvb, pos);
proto_tree_add_uint (tlv_tree, hf_docsis_ucd_symbol_rate,
tvb, pos, length, symrate * 160);
}
else
{
THROW (ReportedBoundsError);
}
pos = pos + length;
break;
case UCD_FREQUENCY:
if (length == 4)
{
proto_tree_add_item (tlv_tree, hf_docsis_ucd_frequency, tvb,
pos, length, FALSE);
pos = pos + length;
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_PREAMBLE:
proto_tree_add_item (tlv_tree, hf_docsis_ucd_preamble_pat, tvb,
pos, length, FALSE);
pos = pos + length;
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_PREAMBLE:
proto_tree_add_item (tlv_tree, hf_docsis_ucd_preamble_pat, tvb,
pos, length, FALSE);
pos = pos + length;
break;
case UCD_BURST_DESCR:
proto_tree_add_item (tlv_tree, hf_docsis_ucd_iuc, tvb,
pos++, 1, FALSE);
endtlvpos = pos + length - 1;
while (pos < endtlvpos)
{
tlvtype = tvb_get_guint8 (tvb, pos++);
tlvlen = tvb_get_guint8 (tvb, pos++);
switch (tlvtype)
break;
case UCD_BURST_DESCR:
proto_tree_add_item (tlv_tree, hf_docsis_ucd_iuc, tvb,
pos++, 1, FALSE);
endtlvpos = pos + length - 1;
while (pos < endtlvpos)
{
case UCD_MODULATION:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_mod_type, tvb,
pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_DIFF_ENCODING:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_diff_encoding,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_PREAMBLE_LEN:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_preamble_len,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_PREAMBLE_VAL_OFF:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_preamble_val_off,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_FEC:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_fec, tvb, pos,
tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_FEC_CODEWORD:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_fec_codeword,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_SCRAMBLER_SEED:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_scrambler_seed,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_MAX_BURST:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_max_burst, tvb,
pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_GUARD_TIME:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_guard_time,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_LAST_CW_LEN:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_last_cw_len,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_SCRAMBLER_ONOFF:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_scrambler_onoff,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
} /* switch(tlvtype) */
pos = pos + tlvlen;
} /* while (pos < endtlvpos) */
break;
} /* switch(type) */
} /* while (pos < len) */
} /* if (tree) */
tlvtype = tvb_get_guint8 (tvb, pos++);
tlvlen = tvb_get_guint8 (tvb, pos++);
switch (tlvtype)
{
case UCD_MODULATION:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_mod_type, tvb,
pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_DIFF_ENCODING:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_diff_encoding,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_PREAMBLE_LEN:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_preamble_len,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_PREAMBLE_VAL_OFF:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_preamble_val_off,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_FEC:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_fec, tvb, pos,
tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_FEC_CODEWORD:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_fec_codeword,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_SCRAMBLER_SEED:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_scrambler_seed,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_MAX_BURST:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_max_burst, tvb,
pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_GUARD_TIME:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_guard_time,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_LAST_CW_LEN:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_last_cw_len,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_SCRAMBLER_ONOFF:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_scrambler_onoff,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
} /* switch(tlvtype) */
pos = pos + tlvlen;
} /* while (pos < endtlvpos) */
break;
case UCD_BURST_DESCR5:
/* DOCSIS 2.0 Upstream Channel Descriptor */
proto_tree_add_item (tlv_tree, hf_docsis_ucd_iuc, tvb,
pos++, 1, FALSE);
endtlvpos = pos + length - 1;
while (pos < endtlvpos)
{
tlvtype = tvb_get_guint8 (tvb, pos++);
tlvlen = tvb_get_guint8 (tvb, pos++);
switch (tlvtype)
{
case UCD_MODULATION:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_mod_type, tvb,
pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_DIFF_ENCODING:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_diff_encoding,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_PREAMBLE_LEN:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_preamble_len,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_PREAMBLE_VAL_OFF:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_preamble_val_off,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_FEC:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_fec, tvb, pos,
tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_FEC_CODEWORD:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_fec_codeword,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_SCRAMBLER_SEED:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_scrambler_seed,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_MAX_BURST:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_max_burst, tvb,
pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_GUARD_TIME:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_guard_time,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_LAST_CW_LEN:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_last_cw_len,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_SCRAMBLER_ONOFF:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_burst_scrambler_onoff,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
/* New cases added for DOCSIS 2.0 US Physical Burst Descriptor TLV */
/* #define UCD_RS_INT_DEPTH 12
* * #define UCD_RS_INT_BLOCK 13
* * #define UCD_PREAMBLE_TYPE 14
* * #define UCD_SCMDA_SCRAMBLER_ONOFF 15
* * #define UCD_SCDMA_CODES_PER_SUBFRAME 16
* * #define UCD_SCDMA_FRAMER_INT_STEP_SIZE 17
* * #define UCD_TCM_ENABLED 18
* */
case UCD_RS_INT_DEPTH:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_rs_int_depth,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_RS_INT_BLOCK:
if (tlvlen == 2)
{
proto_tree_add_item (tlv_tree,
hf_docsis_rs_int_block,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_PREAMBLE_TYPE:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_preamble_type,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_SCMDA_SCRAMBLER_ONOFF:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_scdma_scrambler_onoff,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_SCDMA_CODES_PER_SUBFRAME:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_scdma_codes_per_subframe,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_SCDMA_FRAMER_INT_STEP_SIZE:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_scdma_framer_int_step_size,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case UCD_TCM_ENABLED:
if (tlvlen == 1)
{
proto_tree_add_item (tlv_tree,
hf_docsis_tcm_enabled,
tvb, pos, tlvlen, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
} /* switch(tlvtype) */
pos = pos + tlvlen;
} /* while (pos < endtlvpos) */
break;
} /* switch(type) */
} /* while (pos < len) */
} /* if (tree) */
}
/* Register the protocol with Ethereal */
/* this format is require because a script is used to build the C function
that calls all the protocol registration.
*/
that calls all the protocol registration.
*/
void
proto_register_docsis_ucd (void)
proto_register_docsis_ucd (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_docsis_ucd_upstream_chid,
{"Upstream Channel ID", "docsis.ucd.upchid",
FT_UINT8, BASE_DEC, NULL, 0x0,
@ -512,37 +769,72 @@ proto_register_docsis_ucd (void)
FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
"Scrambler On/Off", HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_ucd,
&ett_tlv,
};
/* Register the protocol name and description */
proto_docsis_ucd =
proto_register_protocol ("DOCSIS Upstream Channel Descriptor",
"DOCSIS UCD", "docsis_ucd");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_ucd, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_ucd", dissect_ucd, proto_docsis_ucd);
{&hf_docsis_rs_int_depth,
{"12 RS Interleaver Depth", "docsis.ucd.burst.rsintdepth",
FT_UINT8, BASE_DEC, NULL, 0x0,
"R-S Interleaver Depth", HFILL}
},
{&hf_docsis_rs_int_block,
{"13 RS Interleaver Block Size", "docsis.ucd.burst.rsintblock",
FT_UINT8, BASE_DEC, NULL, 0x0,
"R-S Interleaver Block", HFILL}
},
{&hf_docsis_preamble_type,
{"14 Preamble Type", "docsis.ucd.burst.preambletype",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Preamble Type", HFILL}
},
{&hf_docsis_scdma_scrambler_onoff,
{"15 SCDMA Scrambler On/Off", "docsis.ucd.burst.scdmascrambleronoff",
FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
"SCDMA Scrambler On/Off", HFILL}
},
{&hf_docsis_scdma_codes_per_subframe,
{"16 SCDMA Codes per Subframe", "docsis.ucd.burst.scdmacodespersubframe",
FT_UINT8, BASE_DEC, NULL, 0x0,
"SCDMA Codes per Subframe", HFILL}
},
{&hf_docsis_scdma_framer_int_step_size,
{"17 SDMA Framer Int Step Size", "docsis.ucd.burst.scdmaframerintstepsize",
FT_UINT8, BASE_DEC, NULL, 0x0,
"SCDMA Framer Interleaving Step Size", HFILL}
},
{&hf_docsis_tcm_enabled,
{"18 TCM Enable", "docsis.ucd.burst.tcmenabled",
FT_UINT8, BASE_DEC, VALS (on_off_vals), 0x0,
"TCM Enabled", HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_ucd,
&ett_tlv,
};
/* Register the protocol name and description */
proto_docsis_ucd =
proto_register_protocol ("DOCSIS Upstream Channel Descriptor",
"DOCSIS UCD", "docsis_ucd");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_ucd, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_ucd", dissect_ucd, proto_docsis_ucd);
}
/* If this dissector uses sub-dissector registration add a registration routine.
This format is required because a script is used to find these routines and
create the code that calls these routines.
*/
This format is required because a script is used to find these routines and
create the code that calls these routines.
*/
void
proto_reg_handoff_docsis_ucd (void)
proto_reg_handoff_docsis_ucd (void)
{
dissector_handle_t docsis_ucd_handle;
docsis_ucd_handle = find_dissector ("docsis_ucd");
dissector_add ("docsis_mgmt", 0x02, docsis_ucd_handle);
dissector_handle_t docsis_ucd_handle;
docsis_ucd_handle = find_dissector ("docsis_ucd");
dissector_add ("docsis_mgmt", 0x02, docsis_ucd_handle);
}