From Guido Reismueller:

packet-mdd.c
- TLV 15 fixed

packet-tlv.c
- Added Support for DOCSIS 3.0 TLVs (38-66)

Added Support for the following DOCSIS 3.0 MAC Management Messages
- DBC-REQ (packet-dbcreq.c)
- DBC-RSP (packet-dbcrsp.c)
- DBC-ACK (packet-dbcack.c)
- CM-CTRL-REQ (packet-cmctrlreq.c)
- CM-CTRL-RSP (packet-cmctrlrsp.c)
- DPV-REQ (packet-dpvreq.c)
- DPV-RSP (packet-dpvrsp.c)

svn path=/trunk/; revision=35193
This commit is contained in:
Jaap Keuter 2010-12-16 07:01:22 +00:00
parent 5ae824fc8f
commit a6b55e6530
14 changed files with 4192 additions and 7 deletions

View File

@ -26,11 +26,18 @@ set(DISSECTOR_SRC
packet-bpkmattr.c
packet-bpkmreq.c
packet-bpkmrsp.c
packet-cmctrlreq.c
packet-cmctrlrsp.c
packet-intrngreq.c
packet-dbcreq.c
packet-dbcrsp.c
packet-dbcack.c
packet-dccack.c
packet-dccreq.c
packet-dccrsp.c
packet-dcd.c
packet-dpvreq.c
packet-dpvrsp.c
packet-docsis.c
packet-dsaack.c
packet-dsareq.c
@ -52,6 +59,7 @@ set(DISSECTOR_SRC
packet-rngrsp.c
packet-sync.c
packet-tlv.c
packet-tlv-cmctrl.c
packet-type29ucd.c
packet-uccreq.c
packet-uccrsp.c

View File

@ -32,11 +32,18 @@ DISSECTOR_SRC = \
packet-bpkmattr.c \
packet-bpkmreq.c \
packet-bpkmrsp.c \
packet-cmctrlreq.c \
packet-cmctrlrsp.c \
packet-intrngreq.c \
packet-dbcreq.c \
packet-dbcrsp.c \
packet-dbcack.c \
packet-dccack.c \
packet-dccreq.c \
packet-dccrsp.c \
packet-dcd.c \
packet-dpvreq.c \
packet-dpvrsp.c \
packet-docsis.c \
packet-dsaack.c \
packet-dsareq.c \
@ -58,6 +65,7 @@ DISSECTOR_SRC = \
packet-rngrsp.c \
packet-sync.c \
packet-tlv.c \
packet-tlv-cmctrl.c \
packet-type29ucd.c \
packet-uccreq.c \
packet-uccrsp.c \
@ -66,4 +74,5 @@ DISSECTOR_SRC = \
# corresponding headers
DISSECTOR_INCLUDES = \
packet-tlv.h
packet-tlv.h \
exceptions.h

View File

@ -0,0 +1,122 @@
/* packet-cmctrlreq.c
* Routines for DOCSIS 3.0 CM Control Request Message dissection.
* Copyright 2010, Guido Reismueller <g.reismueller[AT]avm.de>
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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 <epan/packet.h>
/* Initialize the protocol and registered fields */
static int proto_docsis_cmctrlreq = -1;
static int hf_docsis_cmctrlreq_tranid = -1;
static dissector_handle_t cmctrl_tlv_handle;
/* Initialize the subtree pointers */
static gint ett_docsis_cmctrlreq = -1;
/* Code to actually dissect the packets */
static void
dissect_cmctrlreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
proto_item *it;
proto_tree *cmctrlreq_tree = NULL;
guint16 transid;
tvbuff_t *next_tvb;
transid = tvb_get_ntohs (tvb, 0);
col_clear (pinfo->cinfo, COL_INFO);
col_add_fstr (pinfo->cinfo, COL_INFO,
"CM Control Request: Transaction-Id = %u", transid);
if (tree)
{
it =
proto_tree_add_protocol_format (tree, proto_docsis_cmctrlreq, tvb, 0, -1,
"CM Control Request");
cmctrlreq_tree = proto_item_add_subtree (it, ett_docsis_cmctrlreq);
proto_tree_add_item (cmctrlreq_tree, hf_docsis_cmctrlreq_tranid, tvb, 0, 2,
FALSE);
}
/* Call Dissector for Appendix C TLV's */
next_tvb = tvb_new_subset_remaining (tvb, 2);
call_dissector (cmctrl_tlv_handle, next_tvb, pinfo, cmctrlreq_tree);
}
/* Register the protocol with Wireshark */
/* this format is require because a script is used to build the C function
that calls all the protocol registration.
*/
void
proto_register_docsis_cmctrlreq (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_docsis_cmctrlreq_tranid,
{"Transaction Id", "docsis_cmctrlreq.tranid",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_cmctrlreq,
};
/* Register the protocol name and description */
proto_docsis_cmctrlreq =
proto_register_protocol ("DOCSIS CM Control Request",
"DOCSIS CM-CTRL-REQ", "docsis_cmctrlreq");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_cmctrlreq, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_cmctrlreq", dissect_cmctrlreq, proto_docsis_cmctrlreq);
}
/* 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_cmctrlreq (void)
{
dissector_handle_t docsis_cmctrlreq_handle;
docsis_cmctrlreq_handle = find_dissector ("docsis_cmctrlreq");
cmctrl_tlv_handle = find_dissector ("cmctrl_tlv");
dissector_add ("docsis_mgmt", 0x2A, docsis_cmctrlreq_handle);
}

View File

@ -0,0 +1,130 @@
/* packet-cmctrlrsp.c
* Routines for DOCSIS 3.0 CM Control Response Message dissection.
* Copyright 2010, Guido Reismueller <g.reismueller[AT]avm.de>
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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 <epan/packet.h>
#define RNGRSP_TIMING 1
#define RNGRSP_PWR_LEVEL_ADJ 2
#define RNGRSP_OFFSET_FREQ_ADJ 3
#define RNGRSP_TRANSMIT_EQ_ADJ 4
#define RNGRSP_RANGING_STATUS 5
#define RNGRSP_DOWN_FREQ_OVER 6
#define RNGRSP_UP_CHID_OVER 7
/* Initialize the protocol and registered fields */
static int proto_docsis_cmctrlrsp = -1;
static int hf_docsis_cmctrlrsp_tranid = -1;
static dissector_handle_t cmctrl_tlv_handle;
/* Initialize the subtree pointers */
static gint ett_docsis_cmctrlrsp = -1;
/* Code to actually dissect the packets */
static void
dissect_cmctrlrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
proto_item *it;
proto_tree *cmctrlrsp_tree = NULL;
guint16 transid;
tvbuff_t *next_tvb;
transid = tvb_get_ntohs (tvb, 0);
col_clear (pinfo->cinfo, COL_INFO);
col_add_fstr (pinfo->cinfo, COL_INFO,
"CM Control Response: Transaction-Id = %u", transid);
if (tree)
{
it =
proto_tree_add_protocol_format (tree, proto_docsis_cmctrlrsp, tvb, 0, -1,
"CM Control Response");
cmctrlrsp_tree = proto_item_add_subtree (it, ett_docsis_cmctrlrsp);
proto_tree_add_item (cmctrlrsp_tree, hf_docsis_cmctrlrsp_tranid, tvb, 0, 2,
FALSE);
}
/* Call Dissector for Appendix C TLV's */
next_tvb = tvb_new_subset_remaining (tvb, 2);
call_dissector (cmctrl_tlv_handle, next_tvb, pinfo, cmctrlrsp_tree);
}
/* Register the protocol with Wireshark */
/* this format is require because a script is used to build the C function
that calls all the protocol registration.
*/
void
proto_register_docsis_cmctrlrsp (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_docsis_cmctrlrsp_tranid,
{"Transaction Id", "docsis_cmctrlrsp.tranid",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_cmctrlrsp,
};
/* Register the protocol name and description */
proto_docsis_cmctrlrsp =
proto_register_protocol ("DOCSIS CM Control Response",
"DOCSIS CM-CTRL-RSP", "docsis_cmctrlrsp");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_cmctrlrsp, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_cmctrlrsp", dissect_cmctrlrsp, proto_docsis_cmctrlrsp);
}
/* 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_cmctrlrsp (void)
{
dissector_handle_t docsis_cmctrlrsp_handle;
docsis_cmctrlrsp_handle = find_dissector ("docsis_cmctrlrsp");
cmctrl_tlv_handle = find_dissector ("cmctrl_tlv");
dissector_add ("docsis_mgmt", 0x2B, docsis_cmctrlrsp_handle);
}

View File

@ -0,0 +1,117 @@
/* packet-dbcack.c
* Routines for DOCSIS 3.0 Dynamic Bonding Change Acknowledge Message dissection.
* Copyright 2010, Guido Reismueller <g.reismueller[AT]avm.de>
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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 <epan/packet.h>
/* Initialize the protocol and registered fields */
static int proto_docsis_dbcack = -1;
static int hf_docsis_dbcack_tranid = -1;
static dissector_handle_t docsis_tlv_handle;
/* Initialize the subtree pointers */
static gint ett_docsis_dbcack = -1;
/* Code to actually dissect the packets */
static void
dissect_dbcack (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
proto_item *dbcack_item;
proto_tree *dbcack_tree = NULL;
guint16 transid;
tvbuff_t *next_tvb;
transid = tvb_get_ntohs (tvb, 0);
col_clear (pinfo->cinfo, COL_INFO);
col_add_fstr (pinfo->cinfo, COL_INFO,
"Dynamic Bonding Change Acknowledge: Tran-Id = %u", transid);
if (tree)
{
dbcack_item = proto_tree_add_protocol_format (tree, proto_docsis_dbcack,
tvb, 0, -1,
"Dynamic Bonding Change Acknowledge");
dbcack_tree = proto_item_add_subtree (dbcack_item, ett_docsis_dbcack);
proto_tree_add_item (dbcack_tree, hf_docsis_dbcack_tranid,
tvb, 0, 2, FALSE);
}
/* Call Dissector for Appendix C TLV's */
next_tvb = tvb_new_subset_remaining (tvb, 2);
call_dissector (docsis_tlv_handle, next_tvb, pinfo, dbcack_tree);
}
/* Register the protocol with Wireshark */
/*
* this format is required because a script is used to build the C function
* that calls all the protocol registration.
*/
void
proto_register_docsis_dbcack (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_docsis_dbcack_tranid,
{"Transaction Id", "docsis_dbcack.tranid",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_dbcack,
};
/* Register the protocol name and description */
proto_docsis_dbcack = proto_register_protocol ("DOCSIS Dynamic Bonding Change Acknowledge",
"DOCSIS DBC-ACK",
"docsis_dbcack");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_dbcack, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_dbcack", dissect_dbcack, proto_docsis_dbcack);
}
/* 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_dbcack (void)
{
dissector_handle_t docsis_dbcack_handle;
docsis_dbcack_handle = find_dissector ("docsis_dbcack");
docsis_tlv_handle = find_dissector ("docsis_tlv");
dissector_add ("docsis_mgmt", 0x26, docsis_dbcack_handle);
}

View File

@ -0,0 +1,133 @@
/* packet-dbcreq.c
* Routines for DOCSIS 3.0 Dynamic Bonding Change Request Message dissection.
* Copyright 2010, Guido Reismueller <g.reismueller[AT]avm.de>
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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 <epan/packet.h>
/* Initialize the protocol and registered fields */
static int proto_docsis_dbcreq = -1;
static int hf_docsis_dbcreq_tranid = -1;
static int hf_docsis_dbcreq_number_of_fragments = -1;
static int hf_docsis_dbcreq_fragment_sequence_number = -1;
static dissector_handle_t docsis_tlv_handle;
/* Initialize the subtree pointers */
static gint ett_docsis_dbcreq = -1;
/* Code to actually dissect the packets */
static void
dissect_dbcreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
proto_item *dbcreq_item;
proto_tree *dbcreq_tree = NULL;
guint16 transid;
tvbuff_t *next_tvb;
transid = tvb_get_ntohs (tvb, 0);
col_clear (pinfo->cinfo, COL_INFO);
col_add_fstr (pinfo->cinfo, COL_INFO,
"Dynamic Bonding Change Request: Tran-Id = %u", transid);
if (tree)
{
dbcreq_item = proto_tree_add_protocol_format (tree, proto_docsis_dbcreq,
tvb, 0, -1,
"Dynamic Bonding Change Request");
dbcreq_tree = proto_item_add_subtree (dbcreq_item, ett_docsis_dbcreq);
proto_tree_add_item (dbcreq_tree, hf_docsis_dbcreq_tranid,
tvb, 0, 2, FALSE);
proto_tree_add_item( dbcreq_tree, hf_docsis_dbcreq_number_of_fragments,
tvb, 2, 1, FALSE );
proto_tree_add_item( dbcreq_tree, hf_docsis_dbcreq_fragment_sequence_number ,
tvb, 3, 1, FALSE );
}
/* Call Dissector for Appendix C TLV's */
next_tvb = tvb_new_subset_remaining (tvb, 4);
call_dissector (docsis_tlv_handle, next_tvb, pinfo, dbcreq_tree);
}
/* Register the protocol with Wireshark */
/*
* this format is required because a script is used to build the C function
* that calls all the protocol registration.
*/
void
proto_register_docsis_dbcreq (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_docsis_dbcreq_tranid,
{"Transaction Id", "docsis_dbcreq.tranid",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dbcreq_number_of_fragments,
{"Number of Fragments", "docsis_dbcreq.number_of_fragments",
FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dbcreq_fragment_sequence_number,
{"Fragment Seq No", "docsis_dbcreq.fragment_sequence_number",
FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
NULL, HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_dbcreq,
};
/* Register the protocol name and description */
proto_docsis_dbcreq = proto_register_protocol ("DOCSIS Dynamic Bonding Change Request",
"DOCSIS DBC-REQ",
"docsis_dbcreq");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_dbcreq, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_dbcreq", dissect_dbcreq, proto_docsis_dbcreq);
}
/* 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_dbcreq (void)
{
dissector_handle_t docsis_dbcreq_handle;
docsis_dbcreq_handle = find_dissector ("docsis_dbcreq");
docsis_tlv_handle = find_dissector ("docsis_tlv");
dissector_add ("docsis_mgmt", 0x24, docsis_dbcreq_handle);
}

View File

@ -0,0 +1,130 @@
/* packet-dbcrsp.c
* Routines for DOCSIS 3.0 Dynamic Bonding Change Response Message dissection.
* Copyright 2010, Guido Reismueller <g.reismueller[AT]avm.de>
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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 <epan/packet.h>
extern value_string docsis_conf_code[];
/* Initialize the protocol and registered fields */
static int proto_docsis_dbcrsp = -1;
static int hf_docsis_dbcrsp_tranid = -1;
static int hf_docsis_dbcrsp_conf_code = -1;
static dissector_handle_t docsis_tlv_handle;
/* Initialize the subtree pointers */
static gint ett_docsis_dbcrsp = -1;
/* Code to actually dissect the packets */
static void
dissect_dbcrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
proto_item *dbcrsp_item;
proto_tree *dbcrsp_tree = NULL;
guint16 transid;
guint8 confcode;
tvbuff_t *next_tvb;
transid = tvb_get_ntohs (tvb, 0);
confcode = tvb_get_guint8 (tvb, 2);
col_clear (pinfo->cinfo, COL_INFO);
col_add_fstr (pinfo->cinfo, COL_INFO,
"Dynamic Bonding Change Response: Tran-Id = %u (%s)", transid,
val_to_str (confcode, docsis_conf_code, "%d"));
if (tree)
{
dbcrsp_item = proto_tree_add_protocol_format (tree, proto_docsis_dbcrsp,
tvb, 0, -1,
"Dynamic Bonding Change Response");
dbcrsp_tree = proto_item_add_subtree (dbcrsp_item, ett_docsis_dbcrsp);
proto_tree_add_item (dbcrsp_tree, hf_docsis_dbcrsp_tranid,
tvb, 0, 2, FALSE);
proto_tree_add_item( dbcrsp_tree, hf_docsis_dbcrsp_conf_code,
tvb, 2, 1, FALSE );
}
/* Call Dissector for Appendix C TLV's */
next_tvb = tvb_new_subset_remaining (tvb, 3);
call_dissector (docsis_tlv_handle, next_tvb, pinfo, dbcrsp_tree);
}
/* Register the protocol with Wireshark */
/*
* this format is required because a script is used to build the C function
* that calls all the protocol registration.
*/
void
proto_register_docsis_dbcrsp (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_docsis_dbcrsp_tranid,
{"Transaction Id", "docsis_dbcrsp.tranid",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dbcrsp_conf_code,
{"Confirmation Code", "docsis_dbcrsp.conf_code",
FT_UINT8, BASE_DEC, VALS (docsis_conf_code), 0x0,
NULL, HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_dbcrsp,
};
/* Register the protocol name and description */
proto_docsis_dbcrsp = proto_register_protocol ("DOCSIS Dynamic Bonding Change Response",
"DOCSIS DBC-RSP",
"docsis_dbcrsp");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_dbcrsp, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_dbcrsp", dissect_dbcrsp, proto_docsis_dbcrsp);
}
/* 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_dbcrsp (void)
{
dissector_handle_t docsis_dbcrsp_handle;
docsis_dbcrsp_handle = find_dissector ("docsis_dbcrsp");
docsis_tlv_handle = find_dissector ("docsis_tlv");
dissector_add ("docsis_mgmt", 0x25, docsis_dbcrsp_handle);
}

View File

@ -0,0 +1,182 @@
/* packet-dpvreq.c
* Routines for DOCSIS 3.0 DOCSIS Path Verify Response Message dissection.
* Copyright 2010, Guido Reismueller <g.reismueller[AT]avm.de>
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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 <epan/packet.h>
/* Initialize the protocol and registered fields */
static int proto_docsis_dpvreq = -1;
static int hf_docsis_dpvreq_tranid = -1;
static int hf_docsis_dpvreq_dschan = -1;
static int hf_docsis_dpvreq_flags = -1;
static int hf_docsis_dpvreq_us_sf = -1;
static int hf_docsis_dpvreq_n = -1;
static int hf_docsis_dpvreq_start = -1;
static int hf_docsis_dpvreq_end = -1;
static int hf_docsis_dpvreq_ts_start = -1;
static int hf_docsis_dpvreq_ts_end = -1;
/* Initialize the subtree pointers */
static gint ett_docsis_dpvreq = -1;
/* Code to actually dissect the packets */
static void
dissect_dpvreq (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
proto_item *it;
proto_tree *dpvreq_tree = NULL;
guint16 transid;
guint8 dschan;
transid = tvb_get_ntohs (tvb, 0);
dschan = tvb_get_guint8 (tvb, 2);
col_clear (pinfo->cinfo, COL_INFO);
col_add_fstr (pinfo->cinfo, COL_INFO,
"DOCSIS Path Verify Request: Transaction-Id = %u DS-Ch %d",
transid, dschan);
if (tree)
{
it =
proto_tree_add_protocol_format (tree, proto_docsis_dpvreq, tvb, 0, -1,
"DPV Request");
dpvreq_tree = proto_item_add_subtree (it, ett_docsis_dpvreq);
proto_tree_add_item (dpvreq_tree, hf_docsis_dpvreq_tranid, tvb,
0, 2, FALSE);
proto_tree_add_item (dpvreq_tree, hf_docsis_dpvreq_dschan, tvb,
2, 1, FALSE);
proto_tree_add_item (dpvreq_tree, hf_docsis_dpvreq_flags, tvb,
3, 1, FALSE);
proto_tree_add_item (dpvreq_tree, hf_docsis_dpvreq_us_sf, tvb,
4, 4, FALSE);
proto_tree_add_item (dpvreq_tree, hf_docsis_dpvreq_n, tvb,
8, 2, FALSE);
proto_tree_add_item (dpvreq_tree, hf_docsis_dpvreq_start, tvb,
10, 1, FALSE);
proto_tree_add_item (dpvreq_tree, hf_docsis_dpvreq_end, tvb,
11, 1, FALSE);
proto_tree_add_item (dpvreq_tree, hf_docsis_dpvreq_ts_start, tvb,
12, 4, FALSE);
proto_tree_add_item (dpvreq_tree, hf_docsis_dpvreq_ts_end, tvb,
16, 4, FALSE);
}
}
/* Register the protocol with Wireshark */
/* this format is require because a script is used to build the C function
that calls all the protocol registration.
*/
void
proto_register_docsis_dpvreq (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_docsis_dpvreq_tranid,
{"Transaction Id", "docsis_dpvreq.tranid",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvreq_dschan,
{"Downstream Channel ID", "docsis_dpvreq.dschan",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvreq_flags,
{"Flags", "docsis_dpvreq.flags",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvreq_us_sf,
{"Upstream Service Flow ID", "docsis_dpvreq.us_sf",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvreq_n,
{"N (Measurement avaraging factor)", "docsis_dpvreq.n",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvreq_start,
{"Start Reference Point", "docsis_dpvreq.start",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvreq_end,
{"End Reference Point", "docsis_dpvreq.end",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvreq_ts_start,
{"Timestamp Start", "docsis_dpvreq.ts_start",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvreq_ts_end,
{"Timestamp End", "docsis_dpvreq.ts_end",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_dpvreq,
};
/* Register the protocol name and description */
proto_docsis_dpvreq =
proto_register_protocol ("DOCSIS Path Verify Request",
"DOCSIS DPV-REQ", "docsis_dpvreq");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_dpvreq, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_dpvreq", dissect_dpvreq, proto_docsis_dpvreq);
}
/* 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_dpvreq (void)
{
dissector_handle_t docsis_dpvreq_handle;
docsis_dpvreq_handle = find_dissector ("docsis_dpvreq");
dissector_add ("docsis_mgmt", 0x27, docsis_dpvreq_handle);
}

View File

@ -0,0 +1,182 @@
/* packet-dpvrsp.c
* Routines for DOCSIS 3.0 DOCSIS Path Verify Request Message dissection.
* Copyright 2010, Guido Reismueller <g.reismueller[AT]avm.de>
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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 <epan/packet.h>
/* Initialize the protocol and registered fields */
static int proto_docsis_dpvrsp = -1;
static int hf_docsis_dpvrsp_tranid = -1;
static int hf_docsis_dpvrsp_dschan = -1;
static int hf_docsis_dpvrsp_flags = -1;
static int hf_docsis_dpvrsp_us_sf = -1;
static int hf_docsis_dpvrsp_n = -1;
static int hf_docsis_dpvrsp_start = -1;
static int hf_docsis_dpvrsp_end = -1;
static int hf_docsis_dpvrsp_ts_start = -1;
static int hf_docsis_dpvrsp_ts_end = -1;
/* Initialize the subtree pointers */
static gint ett_docsis_dpvrsp = -1;
/* Code to actually dissect the packets */
static void
dissect_dpvrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
proto_item *it;
proto_tree *dpvrsp_tree = NULL;
guint16 transid;
guint8 dschan;
transid = tvb_get_ntohs (tvb, 0);
dschan = tvb_get_guint8 (tvb, 2);
col_clear (pinfo->cinfo, COL_INFO);
col_add_fstr (pinfo->cinfo, COL_INFO,
"DOCSIS Path Verify Response: Transaction-Id = %u DS-Ch %d",
transid, dschan);
if (tree)
{
it =
proto_tree_add_protocol_format (tree, proto_docsis_dpvrsp, tvb, 0, -1,
"DPV Response");
dpvrsp_tree = proto_item_add_subtree (it, ett_docsis_dpvrsp);
proto_tree_add_item (dpvrsp_tree, hf_docsis_dpvrsp_tranid, tvb,
0, 2, FALSE);
proto_tree_add_item (dpvrsp_tree, hf_docsis_dpvrsp_dschan, tvb,
2, 1, FALSE);
proto_tree_add_item (dpvrsp_tree, hf_docsis_dpvrsp_flags, tvb,
3, 1, FALSE);
proto_tree_add_item (dpvrsp_tree, hf_docsis_dpvrsp_us_sf, tvb,
4, 4, FALSE);
proto_tree_add_item (dpvrsp_tree, hf_docsis_dpvrsp_n, tvb,
8, 2, FALSE);
proto_tree_add_item (dpvrsp_tree, hf_docsis_dpvrsp_start, tvb,
10, 1, FALSE);
proto_tree_add_item (dpvrsp_tree, hf_docsis_dpvrsp_end, tvb,
11, 1, FALSE);
proto_tree_add_item (dpvrsp_tree, hf_docsis_dpvrsp_ts_start, tvb,
12, 4, FALSE);
proto_tree_add_item (dpvrsp_tree, hf_docsis_dpvrsp_ts_end, tvb,
16, 4, FALSE);
}
}
/* Register the protocol with Wireshark */
/* this format is require because a script is used to build the C function
that calls all the protocol registration.
*/
void
proto_register_docsis_dpvrsp (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_docsis_dpvrsp_tranid,
{"Transaction Id", "docsis_dpvrsp.tranid",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvrsp_dschan,
{"Downstream Channel ID", "docsis_dpvrsp.dschan",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvrsp_flags,
{"Flags", "docsis_dpvrsp.flags",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvrsp_us_sf,
{"Upstream Service Flow ID", "docsis_dpvrsp.us_sf",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvrsp_n,
{"N (Measurement avaraging factor)", "docsis_dpvrsp.n",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvrsp_start,
{"Start Reference Point", "docsis_dpvrsp.start",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvrsp_end,
{"End Reference Point", "docsis_dpvrsp.end",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvrsp_ts_start,
{"Timestamp Start", "docsis_dpvrsp.ts_start",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{&hf_docsis_dpvrsp_ts_end,
{"Timestamp End", "docsis_dpvrsp.ts_end",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_docsis_dpvrsp,
};
/* Register the protocol name and description */
proto_docsis_dpvrsp =
proto_register_protocol ("DOCSIS Path Verify Response",
"DOCSIS DPV-RSP", "docsis_dpvrsp");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_docsis_dpvrsp, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("docsis_dpvrsp", dissect_dpvrsp, proto_docsis_dpvrsp);
}
/* 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_dpvrsp (void)
{
dissector_handle_t docsis_dpvrsp_handle;
docsis_dpvrsp_handle = find_dissector ("docsis_dpvrsp");
dissector_add ("docsis_mgmt", 0x28, docsis_dpvrsp_handle);
}

View File

@ -59,7 +59,21 @@
#define MGT_UP_DIS 28
#define MGT_TYPE29UCD 29
#define MGT_INIT_RNG_REQ 30
#define MGT_TEST_REQ 31
#define MGT_DS_CH_DESC 32
#define MGT_MDD 33
#define MGT_B_INIT_RNG_REQ 34
#define MGT_TYPE35UCD 35
#define MGT_DBC_REQ 36
#define MGT_DBC_RSP 37
#define MGT_DBC_ACK 38
#define MGT_DPV_REQ 39
#define MGT_DPV_RSP 40
#define MGT_CM_STATUS 41
#define MGT_CM_CTRL_REQ 42
#define MGT_CM_CTRL_RSP 43
#define MGT_REG_REQ_MP 44
#define MGT_REG_RSP_MP 45
/* Initialize the protocol and registered fields */
@ -86,6 +100,7 @@ static const value_string mgmt_type_vals[] = {
{MGT_SYNC, "Timing Synchronisation"},
{MGT_UCD, "Upstream Channel Descriptor"},
{MGT_TYPE29UCD, "Upstream Channel Descriptor Type 29"},
{MGT_TYPE35UCD, "Upstream Channel Descriptor Type 35"},
{MGT_MAP, "Upstream Bandwidth Allocation"},
{MGT_RNG_REQ, "Ranging Request"},
{MGT_RNG_RSP, "Ranging Response"},
@ -113,7 +128,20 @@ static const value_string mgmt_type_vals[] = {
{MGT_DCI_RSP, "Device Class Identification Response"},
{MGT_UP_DIS, "Upstream Channel Disable"},
{MGT_INIT_RNG_REQ, "Initial Ranging Request"},
{MGT_TEST_REQ, "Test Request Message"},
{MGT_DS_CH_DESC, "Downstream Channel Descriptor"},
{MGT_MDD, "MAC Domain Descriptor"},
{MGT_B_INIT_RNG_REQ, "Bonded Initial Ranging Request"},
{MGT_DBC_REQ, "Dynamic Bonding Change Request"},
{MGT_DBC_RSP, "Dynamic Bonding Change Response"},
{MGT_DBC_ACK, "Dynamic Bonding Change Acknowledge"},
{MGT_DPV_REQ, "DOCSIS Path Verify Request"},
{MGT_DPV_RSP, "DOCSIS Path Verify Response"},
{MGT_CM_STATUS, "CM Status Report"},
{MGT_CM_CTRL_REQ, "CM Control Request"},
{MGT_CM_CTRL_RSP, "CM Control Response"},
{MGT_REG_REQ_MP, "Multipart Registration Request"},
{MGT_REG_RSP_MP, "Multipart Registration Response"},
{0, NULL}
};
@ -177,8 +205,6 @@ dissect_macmgmt (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
return;
else
call_dissector (data_handle, payload_tvb, pinfo, tree);
}

View File

@ -171,6 +171,8 @@ static const value_string mdd_tlv_vals[] = {
{CM_STATUS_EVENT_CONTROL , "CM-STATUS Event Control"},
{UPSTREAM_TRANSMIT_POWER_REPORTING , "Upstream Transmit Power Reporting"},
{DSG_DA_TO_DSID_ASSOCIATION_ENTRY , "DSG DA-to-DSID Association Entry"},
{CM_STATUS_EVENT_ENABLE_NON_CHANNEL_SPECIFIC_EVENTS ,
"CM-STATUS Event Enable for Non-Channel-Specific-Events"},
{0, NULL}
};
@ -516,9 +518,11 @@ dissect_mdd (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
break;
case CM_STATUS_EVENT_ENABLE_NON_CHANNEL_SPECIFIC_EVENTS:
subpos = pos + 2;
proto_tree_add_item (tlv_tree, hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_sequence_out_of_range, tvb, subpos + 2 , 2,FALSE);
proto_tree_add_item (tlv_tree, hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_operating_on_battery_backup, tvb, subpos + 2 , 2,FALSE);
proto_tree_add_item (tlv_tree, hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_returned_to_ac_power, tvb, subpos + 2 , 2,FALSE);
tlv_sub_item = proto_tree_add_text (tlv_tree, tvb, subpos, 2, "CM-STATUS Event Enable Bitmask for Non-Channel-Specific Events");
tlv_sub_tree = proto_item_add_subtree (tlv_sub_item, ett_sub_tlv);
proto_tree_add_item (tlv_sub_tree, hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_sequence_out_of_range, tvb, subpos, 2,FALSE);
proto_tree_add_item (tlv_sub_tree, hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_operating_on_battery_backup, tvb, subpos , 2,FALSE);
proto_tree_add_item (tlv_sub_tree, hf_docsis_mdd_cm_status_event_enable_non_channel_specific_events_cm_returned_to_ac_power, tvb, subpos , 2,FALSE);
break;
}
pos += length + 2;
@ -725,6 +729,7 @@ void proto_register_docsis_mdd (void)
FT_UINT16, BASE_DEC, NULL, 0x0400,
"CM-STATUS event non-channel-event Cm returned to AC power", HFILL}
},
};
/* Setup protocol subtree array */

View File

@ -0,0 +1,355 @@
/* packet-tlv-cmctrl.c
* Routines to Dissect TLV's for CM-Control Messages
* Copyright 2010, Guido Reismueller <g.reismueller[AT]avm.de>
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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 <epan/packet.h>
#define CM_CTRL_MUTE 1
#define CM_CTRL_MUTE_TIMEOUT 2
#define CM_CTRL_REINIT 3
#define CM_CTRL_DISABLE_FWD 4
#define CM_CTRL_DS_EVENT 5
#define CM_CTRL_US_EVENT 6
#define CM_CTRL_EVENT 7
#define DS_EVENT_CH_ID 1
#define DS_EVENT_MASK 2
#define US_EVENT_CH_ID 1
#define US_EVENT_MASK 2
static int proto_cmctrl_tlv = -1;
static int hf_cmctrl_tlv_mute = -1;
static int hf_cmctrl_tlv_mute_timeout = -1;
static int hf_cmctrl_tlv_reinit = -1;
static int hf_cmctrl_tlv_disable_fwd = -1;
static int hf_cmctrl_tlv_ds_event = -1;
static int hf_cmctrl_tlv_us_event = -1;
static int hf_cmctrl_tlv_event = -1;
static int hf_ds_event_ch_id = -1;
static int hf_ds_event_mask = -1;
static int hf_us_event_ch_id = -1;
static int hf_us_event_mask = -1;
static gint ett_cmctrl_tlv = -1;
static gint ett_cmctrl_tlv_ds_event = -1;
static gint ett_cmctrl_tlv_us_event = -1;
static void
dissect_ds_event(tvbuff_t * tvb, proto_tree *tree, int start, guint16 len)
{
guint8 type, length;
proto_item *it;
proto_tree *event_tree;
int pos = start;
it =
proto_tree_add_text (tree, tvb, start, len,
"Override Downstream Status Event Event Mask (Length = %u)", len);
event_tree = proto_item_add_subtree (it, ett_cmctrl_tlv_ds_event);
while (pos < (start + len))
{
type = tvb_get_guint8 (tvb, pos++);
length = tvb_get_guint8 (tvb, pos++);
switch (type)
{
case DS_EVENT_CH_ID:
if (length == 1)
{
proto_tree_add_item (event_tree, hf_ds_event_ch_id,
tvb, pos, length, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case DS_EVENT_MASK:
if (length == 2)
{
proto_tree_add_item (event_tree, hf_ds_event_mask,
tvb, pos, length, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
} /* switch */
pos = pos + length;
} /* while */
}
static void
dissect_us_event(tvbuff_t * tvb, proto_tree *tree, int start, guint16 len)
{
guint8 type, length;
proto_item *it;
proto_tree *event_tree;
int pos = start;
it =
proto_tree_add_text (tree, tvb, start, len,
"Override Upstream Status Enable Event Mask (Length = %u)", len);
event_tree = proto_item_add_subtree (it, ett_cmctrl_tlv_us_event);
while (pos < (start + len))
{
type = tvb_get_guint8 (tvb, pos++);
length = tvb_get_guint8 (tvb, pos++);
switch (type)
{
case US_EVENT_CH_ID:
if (length == 1)
{
proto_tree_add_item (event_tree, hf_us_event_ch_id,
tvb, pos, length, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case US_EVENT_MASK:
if (length == 2)
{
proto_tree_add_item (event_tree, hf_us_event_mask,
tvb, pos, length, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
} /* switch */
pos = pos + length;
} /* while */
}
static void
dissect_cmctrl_tlv (tvbuff_t * tvb, packet_info * pinfo _U_, proto_tree * tree)
{
proto_item *it;
proto_tree *tlv_tree;
int pos = 0;
gint total_len;
guint8 type, length;
total_len = tvb_reported_length_remaining (tvb, 0);
it =
proto_tree_add_protocol_format (tree, proto_cmctrl_tlv, tvb, 0,
total_len, "TLV Data");
tlv_tree = proto_item_add_subtree (it, ett_cmctrl_tlv);
while (pos < total_len)
{
type = tvb_get_guint8 (tvb, pos++);
length = tvb_get_guint8 (tvb, pos++);
switch (type)
{
case CM_CTRL_MUTE:
if (length == 1)
{
proto_tree_add_item (tlv_tree, hf_cmctrl_tlv_mute,
tvb, pos, length, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case CM_CTRL_MUTE_TIMEOUT:
if (length == 4 || length == 1) /* response TLV always with len 1 */
{
proto_tree_add_item (tlv_tree, hf_cmctrl_tlv_mute_timeout,
tvb, pos, length, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case CM_CTRL_REINIT:
if (length == 1)
{
proto_tree_add_item (tlv_tree, hf_cmctrl_tlv_reinit,
tvb, pos, length, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case CM_CTRL_DISABLE_FWD:
if (length == 1)
{
proto_tree_add_item (tlv_tree, hf_cmctrl_tlv_disable_fwd,
tvb, pos, length, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
case CM_CTRL_DS_EVENT:
if (length == 1)
proto_tree_add_item (tlv_tree, hf_cmctrl_tlv_ds_event,
tvb, pos, length, FALSE);
else
dissect_ds_event(tvb, tlv_tree, pos, length);
break;
case CM_CTRL_US_EVENT:
if (length == 1)
proto_tree_add_item (tlv_tree, hf_cmctrl_tlv_ds_event,
tvb, pos, length, FALSE);
else
dissect_us_event(tvb, tlv_tree, pos, length);
break;
case CM_CTRL_EVENT:
if (length == 2 || length == 1) /* response TLV always with len 1 */
{
proto_tree_add_item (tlv_tree, hf_cmctrl_tlv_event,
tvb, pos, length, FALSE);
}
else
{
THROW (ReportedBoundsError);
}
break;
} /* switch */
pos = pos + length;
} /* while */
}
/* Register the protocol with Wireshark */
/* this format is require because a script is used to build the C function
that calls all the protocol registration.
*/
void
proto_register_cmctrl_tlv (void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{&hf_cmctrl_tlv_mute,
{"1 Upstream Channel RF Mute", "cmctrl_tlv.mute",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Upstream Channel RF Mute", HFILL}
},
{&hf_cmctrl_tlv_mute_timeout,
{"2 RF Mute Timeout Interval", "cmctrl_tlv.mute_timeout",
FT_UINT32, BASE_DEC, NULL, 0x0,
"RF Mute Timeout Interval", HFILL}
},
{&hf_cmctrl_tlv_reinit,
{"3 CM Reinitialize", "cmctrl_tlv.reinit",
FT_UINT8, BASE_DEC, NULL, 0x0,
"CM Reinitialize", HFILL}
},
{&hf_cmctrl_tlv_disable_fwd,
{"4 Disable Forwarding", "cmctrl_tlv.disable_fwd",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Disable Forwarding", HFILL}
},
{&hf_cmctrl_tlv_ds_event,
{"5 Override Downstream Events", "cmctrl_tlv.ds_event",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Override Downstream Events", HFILL}
},
{&hf_ds_event_ch_id,
{".1 Downstream Channel ID", "cmctrl_tlv.ds_event.chid",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Downstream Channel ID", HFILL}
},
{&hf_ds_event_mask,
{".2 Downstream Status Event Enable Bitmask", "cmctrl_tlv.ds_event.mask",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Downstream Status Event Enable Bitmask", HFILL}
},
{&hf_cmctrl_tlv_us_event,
{"6 Override Upstream Events", "cmctrl_tlv.us_event",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Override Downstream Events", HFILL}
},
{&hf_us_event_ch_id,
{".1 Upstream Channel ID", "cmctrl_tlv.us_event.chid",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Upstream Channel ID", HFILL}
},
{&hf_us_event_mask,
{".2 Upstream Status Event Enable Bitmask", "cmctrl_tlv.us_event.mask",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Upstream Status Event Enable Bitmask", HFILL}
},
{&hf_cmctrl_tlv_event,
{"7 Override Non-Channel-Specific Events", "cmctrl_tlv.event",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Override Non-Channel-Specific Events", HFILL}
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_cmctrl_tlv,
&ett_cmctrl_tlv_ds_event,
&ett_cmctrl_tlv_us_event,
};
/* Register the protocol name and description */
proto_cmctrl_tlv = proto_register_protocol ("DOCSIS CM-CTRL TLV's",
"DOCSIS CM-CTRL TLVs", "cmctrl_tlv");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array (proto_cmctrl_tlv, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_dissector ("cmctrl_tlv", dissect_cmctrl_tlv, proto_cmctrl_tlv);
}
/* 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_cmctrl_tlv (void)
{
dissector_handle_t cmctrl_tlv_handle;
cmctrl_tlv_handle = find_dissector ("cmctrl_tlv");
dissector_add ("docsis", 0xFE, cmctrl_tlv_handle);
}

File diff suppressed because it is too large Load Diff

View File

@ -66,7 +66,34 @@
#define TLV_SUBS_MGMT_CTRL 35
#define TLV_SUBS_MGMT_CPE 36
#define TLV_SUBS_MGMT_FLTR 37
#define TLV_VENDOR_SPEC 43
#define TLV_SNMPV3_NTFY_RCVR 38
#define TLV_ENABLE_20_MODE 39
#define TLV_ENABLE_TEST_MODES 40
#define TLV_DS_CH_LIST 41
#define TLV_MC_MAC_ADDRESS 42
#define TLV_VENDOR_SPEC 43 /* Vendor Specific is actually 44 ? */
#define TLV_DUT_FILTER 45
#define TLV_TCC 46
#define TLV_SID_CL 47
#define TLV_RCP 48
#define TLV_RCC 49
#define TLV_DSID 50
#define TLV_SEC_ASSOC 51
#define TLV_INIT_CH_TIMEOUT 52
#define TLV_SNMPV1V2_COEX 53
#define TLV_SNMPV3_ACC_VIEW 54
#define TLV_SNMP_CPE_ACC_CTRL 55
#define TLV_CH_ASGN 56
#define TLV_CM_INIT_REASON 57
#define TLV_SW_UPG_SRVR_IPV6 58
#define TLV_TFTP_PROV_CM_IPV6_ADDR 59
#define TLV_US_DROP_CLFY 60
#define TLV_SUBS_MGMT_IPV6_LST 61
#define TLV_US_DROP_CLFY_GROUP_ID 62
#define TLV_SUBS_MGMT_CTRL_MAX_CPE_IPV6 63
#define TLV_CMTS_MC_SESS_ENC 64
#define TLV_L2VPN_MAC_AGING 65
#define TLV_MGMT_EVENT_CTRL 66
#define TLV_END 255
/* Define DOCSIS 1.0 Class Of Service Configuration Types
@ -226,4 +253,187 @@
#define PHS_ERR_CODE 2
#define PHS_ERR_MSG 3
/* Define DS Channel List sub-types
* These are subtypes of TLV_DS_CHANNEL_LIST (41)
*/
#define DS_CH_LIST_SINGLE 1
#define DS_CH_LIST_RANGE 2
#define DS_CH_LIST_DEFAULT_TIMEOUT 3
/* Define Singe Downstream Channel sub-types
* These are subtypes of DS_CH_LIST_SINGLE (41.1)
*/
#define SINGLE_CH_TIMEOUT 1
#define SINGLE_CH_FREQ 2
/* Define Singe Downstream Channel sub-types
* These are subtypes of DS_CH_LIST_RANGE (41.2)
*/
#define FREQ_RNG_TIMEOUT 1
#define FREQ_RNG_START 2
#define FREQ_RNG_END 3
#define FREQ_RNG_STEP 4
/* Define DUT sub-types
* These are subtypes of TLV_DUT_FILTER (45)
*/
#define DUT_CONTROL 1
#define DUT_CMIM 2
/* Define TCC sub-types
* These are subtypes of TLV_TCC (46)
*/
#define TLV_TCC_REFID 1
#define TLV_TCC_US_CH_ACTION 2
#define TLV_TCC_US_CH_ID 3
#define TLV_TCC_NEW_US_CH_ID 4
#define TLV_TCC_UCD 5
#define TLV_TCC_RNG_SID 6
#define TLV_TCC_INIT_TECH 7
#define TLV_TCC_RNG_PARMS 8
#define TLV_TCC_DYN_RNG_WIN 9
#define TLV_TCC_ERR 254
/* Define TLV_TCC_RNG_PARMS sub-types
* These are subtypes of TLV_TCC_RNG_PARMS (46.8)
*/
#define RNG_PARMS_US_CH_ID 1
#define RNG_PARMS_TIME_OFF_INT 2
#define RNG_PARMS_TIME_OFF_FRAC 3
#define RNG_PARMS_POWER_OFF 4
#define RNG_PARMS_FREQ_OFF 5
/* Define TLV_TCC_ERR sub-types
* These are subtypes of TLV_TCC_ERR (46.254)
*/
#define TCC_ERR_SUBTYPE 1
#define TCC_ERR_CODE 2
#define TCC_ERR_MSG 3
/* Define TLV_SID_CLUSTER sub-types
* These are subtypes of TLV_SID_CLUSTER (47)
*/
#define SID_CL_SF_ID 1
#define SID_CL_ENC 2
#define SID_CL_SO_CRIT 3
/* Define SID_CL_ENC sub-types
* These are subtypes of SID_CL_ENC (47.2)
*/
#define SID_CL_ENC_ID 1
#define SID_CL_ENC_MAP 2
/* Define SID_CL_ENC_MAP sub-types
* These are subtypes of SID_CL_ENC_MAP (47.2.2)
*/
#define SID_CL_MAP_US_CH_ID 1
#define SID_CL_MAP_SID 2
#define SID_CL_MAP_ACTION 3
/* Define SID_CL_SO_CRIT sub-types
* These are subtypes of SID_CL_SO_CRIT (47.3)
*/
#define SID_CL_SO_MAX_REQ 1
#define SID_CL_SO_MAX_OUT_BYTES 2
#define SID_CL_SO_MAX_REQ_BYTES 3
#define SID_CL_SO_MAX_TIME 4
/* Define TLV_RCP sub-types
* These are subtypes of TLV_RCP (48)
*/
#define TLV_RCP_ID 1
#define TLV_RCP_NAME 2
#define TLV_RCP_FREQ_SPC 3
#define TLV_RCP_RCV_MOD_ENC 4
#define TLV_RCP_RCV_CH 5
#define TLV_RCP_VEN_SPEC 43
#define TLV_RCC_ERR 254
/* Define TLV_RCP_RCV_MOD_ENC sub-types
* These are subtypes of TLV_RCP_RCV_MOD_ENC (48.4)
*/
#define RCV_MOD_ENC_IDX 1
#define RCV_MOD_ENC_ADJ_CH 2
#define RCV_MOD_ENC_CH_BL_RNG 3
#define RCV_MOD_ENC_CTR_FREQ_ASGN 4
#define RCV_MOD_ENC_RSQ_CH_SUBS_CAP 5
#define RCV_MOD_ENC_CONN 6
#define RCV_MOD_ENC_PHY_LAYR_PARMS 7
/* Define RCV_MOD_ENC_CH_BL_RNG sub-types
* These are subtypes of RCV_MOD_ENC_CH_BL_RNG (48.4.3)
*/
#define CH_BL_RNG_MIN_CTR_FREQ 1
#define CH_BL_RNG_MAX_CTR_FREQ 2
/* Define TLV_RCP_RCV_CH sub-types
* These are subtypes of TLV_RCP_RCV_CH (48.5)
*/
#define RCV_CH_IDX 1
#define RCV_CH_CONN 2
#define RCV_CH_CONN_OFF 3
#define RCV_CH_CTR_FREQ_ASGN 4
#define RCV_CH_PRIM_DS_CH_IND 5
/* Define TLV_RCC_ERR sub-types
* These are subtypes of TLV_RCC_ERR (49.254)
*/
#define RCC_ERR_MOD_OR_CH 1
#define RCC_ERR_IDX 2
#define RCC_ERR_PARAM 3
#define RCC_ERR_CODE 4
#define RCC_ERR_MSG 5
/* Define TLV_DSID sub-types
* These are subtypes of TLV_DSID (50)
*/
#define TLV_DSID_ID 1
#define TLV_DSID_ACTION 2
#define TLV_DSID_DS_RESEQ 3
#define TLV_DSID_MC 4
/* Define TLV_DSID_DS_RESEQ sub-types
* These are subtypes of TLV_DSID_DS_RESEQ (50.3)
*/
#define DS_RESEQ_DSID 1
#define DS_RESEQ_CH_LST 2
#define DS_RESEQ_WAIT_TIME 3
#define DS_RESEQ_WARN_THRESH 4
#define DS_RESEQ_HO_TIMER 5
/* Define TLV_DSID_MC sub-types
* These are subtypes of TLV_DSID_DS_MC (50.4)
*/
#define TLV_DSID_MC_ADDR 1
#define TLV_DSID_MC_CMIM 2
#define TLV_DSID_MC_GROUP 3
#define TLV_DSID_MC_PHS 26
/* Define TLV_DSID_MC_ADDR sub-types
* These are subtypes of TLV_DSID_MC_ADDR (50.4.1)
*/
#define MC_ADDR_ACTION 1
#define MC_ADDR_ADDR 2
/* Define TLV_SEC_ASSOC sub-types
* These are subtypes of TLV_SEC_ASSOC (51)
*/
#define TLV_SEC_ASSOC_ACTION 1
#define TLV_SEC_ASSOC_DESC 2
/* Define TLV_CH_ASGN sub-types
* These are subtypes of TLV_CH_ASGN (56)
*/
#define TLV_CH_ASGN_US_CH_ID 1
#define TLV_CH_ASGN_RX_FREQ 2
/* Define TLV_CMTS_MC_SESS_ENC sub-types
* These are subtypes of TLV_CMTS_MC_SESS_ENC (64)
*/
#define CMTS_MC_SESS_ENC_GRP 1
#define CMTS_MC_SESS_ENC_SRC 2
#endif