forked from osmocom/wireshark
From Brian Wheeler: DOCSIS 2.0 support.
svn path=/trunk/; revision=10387
This commit is contained in:
parent
3c0839b99b
commit
2b9ad9ec25
4
AUTHORS
4
AUTHORS
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Author :
|
||||
Anand Narwani <anand[AT]narwani.org>
|
||||
|
||||
Brian Wheeler <brian.wheeler[AT]arrisi.com>
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ();
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
|
@ -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"},
|
||||
|
|
|
@ -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
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue